おしながき

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ファイルフォーマット

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

.debug_abbrevセクションって何?

.debug_infoセクション内の、メインのデバッグ情報の「データ構造」を定義している「Abbreviationsデータ」を格納しているセクションですね。
つまり、.debug_infoセクションに書かれているデータの「メタデータ」です。

といわれても。。。これいまいち想像つかみにくいんで、まずはデバッグ情報とDIE(.debug_info/.debug_abbrevセクションの概要)を見てくださいな。以下、その前提っす。


以下ごせつめいのぜんてー条件

まず、またまた参考まで、readelf君謹製.debug_abbrevセクション解析データの例を以下にです。

Contents of the .debug_abbrev section:

  Number TAG
   1      DW_TAG_compile_unit    [has children]
    DW_AT_producer     DW_FORM_string
    DW_AT_language     DW_FORM_data1
    DW_AT_name         DW_FORM_string
    DW_AT_comp_dir     DW_FORM_string
    DW_AT_low_pc       DW_FORM_addr
    DW_AT_high_pc      DW_FORM_addr
    DW_AT_stmt_list    DW_FORM_data4
   2      DW_TAG_base_type    [no children]
    DW_AT_byte_size    DW_FORM_data1
    DW_AT_encoding     DW_FORM_data1
    DW_AT_name         DW_FORM_string
   3      DW_TAG_base_type    [no children]
    DW_AT_byte_size    DW_FORM_data1
    DW_AT_encoding     DW_FORM_data1
  (以下続く、ここでは省略)
まず、説明の前提として、以下とします。

  • "1 DW_TAG_compile_unit children"〜"DW_AT_stmt_list DW_FORM_data4"までの8行
    • この、数字(Abbrev ID)ではじまる行から、次の数字(Abbrev ID)の前の行までのカタマリを「Abbrevレコード」と仮に呼ぶことにします。
  • "2 DW_TAG_base_type children"〜"DW_AT_name DW_FORM_string"までの4行
    • このカタマリも、「Abbrevレコード」ですね。


.debug_abbrevセクションのデータ格納構造

これは、簡単です。このセクションは、ヘッダとか無く、以下の構造で表現された「Abbrevレコード」が、必要数分、ひたすら続いているだけ、です。

で、それぞれの「Abbrevレコード」は、以下の表の上から下の順に、データが連続してつまっているだけ、の構造になっています。

項番 形式/サイズ データ項目名 せつめい
1 uLEB128 Abbrev ID このAbbrevレコードのAbbrev IDです。
この値が、.debug_infoセクション内の各DIEの冒頭に書かれています(これによって参照されます)
2 uLEB128 TAGコード このAbbrevレコードのTAG名毎に割り振られたコードです。
つまり、この値次第で、このAbbrevレコードの構造で格納されたDIEは何のためのデータか、が分かります。
TAGコードとその意味は(こちら)をみてね
※例:DW_TAG_subprogramなら、関数のデバッグ情報なのじゃな、など
3 1 Byte 子DIEの有無 このAbbrevレコードのデータ構造でデバッグ情報を格納しているDIEに、子DIEがいるかどうかを示しています。
値は、0x01 (DW_CHILDREN_yes)→子DIEあり。
0x00 (DW_CHILDREN_no) → 子DIEなし。(続くDIEは同じ階層のDIE、つまり兄弟DIE
4-1 uLEB128 Attributeコード このAbbrevレコードが持つ、Attribute(属性)のコードです。
このAttributeは、AbbrevレコードのTAG名次第で、必要な数が可変です。なので、「4-1 Attributeコードと次の4-2 FORMコードの組」が、必要なAttribute数分、繰り返されます
Attirbuteコードとその意味は(こちら)を見てね
4-2 uLEB128 Formコード 4-1のAttributeコードで示されるデータ属性の実際の値の格納方法を示すコードが格納されています。 この値次第で、.debug_section内に直接2Byte定数で書かれていたり、文字列で書かれていたり、アドレスであったり、します
このFormコードの一覧と意味は(こちら)をみてくださいです。
- - - (Attribute数分、4-1と4-2のセット、つまりuLEB128が2個づつ、繰り返し。。。)
x-1 uLEB128 Attributeコード
0x00 (終端)
AbbrevレコードがもっているAttributeの数だけ、4-1と4-2のセットが繰り返されたあとの終端は、Attributeコード、Formコードとも「0」のレコードが来て1つのAbbrevレコード終り、となります。
x-2 uLEB128 Formコード
0x00 (終端)
(同上)

(2013/6/12 まだ作成したてよぉ〜)

実機データの解析例


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