おしながき

ELFファイルフォーマット

  • .eh_frameセクションの構造と読み方

DWARFファイルフォーマット

NCURSESライブラリ

  • NCURSES Programing HOWTO ワタクシ的ほんやく
    1. Tools and Widget Libraries
    2. Just For Fun !!!
    3. References
  • その他、自分メモ
  • NCURSES雑多な自分メモ01


最近の更新 (Recent Changes)

2019-09-24
2013-10-10
2013-10-03
2013-10-01
2013-09-29
目次に戻る:DWARFファイルフォーマット

TAG詳細(その01) ※compile_unit、partial_unit、imported_unit

ということで、DW_TAG_xxxxの詳細です。

DW_TAG_compile_unit / DW_TAG_partial_unit

  • これらは、めちゃくちゃ簡単に言うと、.cや.cppのソースファイル単位=.oのオブジェクトファイル単位に、1つ生成されます。
  • DW_TAG_compile_unit と DW_TAG_partial_unit は、「排他」です。どっちかいっこしか、生成されません。
  • これら2つの違いは、以下です。
    • DW_TAG_compile_unit:
      • 通常は、こちらが生成されます。
      • インクルードファイル(".h"など)を含む、1つの単純な".o"ファイルに対するデバッグ情報で、このタグを持ったDIEが実質的に".o"のデバッグ情報のヘッダになりますです。
    • DW_TAG_partial_unit:
      • 例えば、ある".o"のコードやデータ部分を分割して、分割したうちの1つを複数の他のcompilation Unitで共用するようにした方が、デバッグ情報のデータ量を削減できるようなケースで、分割された部分に付与されるタグがこれです。
  • 取り得るAttributeは以下の通りでごんす。(但し、以下一覧に書くAttributeは必ずしも持っていないこともあり、また書いていないものでも持ってることがあるんで、あくまで「目安」でございます。(と原文にも明記あるんですねぇ)
    No. Attribute名 意味/使われ方
    1 1) DW_AT_low_pc & DW_AT_high_pc
    2) DW_AT_ranges
    3) DW_AT_low_pc & DW_AT_ranges
    マシンコードのアドレス範囲を示すです。以下3パターンあり
    1) 連続したコードの範囲
    2) 不連続だけど.debug_rangesで示されるコードの範囲
    3) DW_AT_low_pcで示されたベースアドレス+DW_AT_rangesで表示されたベースアドレス上の範囲
    2 DW_AT_name NULL文字終端のソースファイル名
    3 DW_AT_language ソースの使用言語のコード(※取り得る値は[ Attribute名(DW_AT_yyyy)一覧と値、意味]を参照)
    4 DW_AT_stmt_list このCUに該当するヘッダ部分への.debug_lineセクションの先頭からのオフセット
    ※ソースファイル上の行数とアセンブラの行数を紐付ける情報へのリンク
    5 DW_AT_macro_info このCUで定義されているマクロ情報が格納されている、.debug_macinfo内の該当箇所(先頭)へのリンク
    6 DW_AT_comp_dir このCUをコンパイルした際のWork Dir.名
    (UNIXの場合は"hostname:pathname"の形式で格納され、hostnameが取得不可の場合は":pathname"で格納されるので注意)
    7 DW_AT_producer コンパイラの任意文字列です。コンパイラの気分次第で歌ってもいーそうですが、
    一応コンパイラを特定できるようにしてほしいことと、他のコンパイラと混同する文字はやめてよねぇって書いてます
    8 DW_AT_identifier_case ソースで使われている変数名/関数名などの名称の字面の取扱方です。
    DW_ID_case_sensitive(0x00) は、ソース上で使われている名称の大文字/小文字をそのまま区別するということです。つまり、ソース上の名称をそのまま検索可です
    DW_ID_up_case(0x01)は、ソース上の名称をコンパイラが(勝手に)大文字に置き換えてます、ってこと。よって、デバッガが検索時は全部大文字変換してから検索せよってお達しです。
    DW_ID_down_case(0x02)は逆で、全部小文字ってこと。
    DW_ID_case_insensitive(0x03)は、名称自体の大文字/小文字変換はやっていず、通常ソース上の表記のまま検索できるけど、中にはコンパイラの変換によって検索できない地雷があるよ、ってことです。
    9 DW_AT_base_types カレントのCUで扱う基本型(intなど)の定義を、他のCUで行っているDIEを参照する形とする場合、その他のCUへの参照が格納されますです。
    これ、ユーザが基本型を上書きしたいようなケースで使えるよ、ってありますが。。。んなケースあんまないよね通常。
    10 DW_AT_use_UTF8 このCU内で用いる全ての文字列のエンコードがUTF-8かどうかのフラグでごわす。
なお、CU内のでベースアドレスは、"DW_AT_low_pc"が存在する場合、この値で定義されるけど、もしなかったらベースアドレス自体が未定義になるです。よって、仮に未定義の場合、このCU内の他のDIEでベースアドレスを前提としたものがあったとしても、そいつらは全部無効になるので注意。(ただし、これはもしあったらコンパイラのDWARF情報生成バグだよねきっと。)


DW_TAG_imported_unit

* DW_AT_import属性を持っていて、こいつの値の中にはimportしているCUのDW_TAG_compile_unitかDW_TAG_partial_unitへのリンクが入っている。

  • いまいち、何の時に使うのか分かってません。。。


目次に戻る:DWARFファイルフォーマット