DEBUG_INFOの解析が走り出した

readelf --debug-dumpの出力を解析して、ユーザ・プログラムに出てくる変数や関数の情報を取り出すプログラムを開発しています。

例えば、こんな二行を解析して・・・
 8ad 1 10 3 int 2 5-(signed)
 8b4 1 20 6 xt_int 1 69 <0x8ad> 1 3-byte-block:-3-53-0-(DW_OP_addr:-53)

 こんな情報を取り出します。

 xt_int 53 2 base_type 2  int 2

変数名はxt_int、アドレスは0x53で2バイトのint型変数という結果です。

base_tytpeの変数なので情報も取り出し易いのですが・・・

 

構造体変数に関する入力行はこんな感じで・・・

 91e 2 9 5 tstr 1 74 <0x95b> 3-byte-block:-3-4a-0-(DW_OP_addr:-4a)
 95b 1 21 5 <0x98f> test_struct 3 1 72
 970 2 6 3 test_c <0x844> 2-byte-block:-23-0-(DW_OP_plus_uconst:-0)
 97f 2 6 3 test_i <0x8ad> 2-byte-block:-23-1-(DW_OP_plus_uconst:-1)

出力はこうなります。
 tstr 4a 3 structure_type 6  1 test_c <test_c|null|1|base_type|unsigned-char|1> 2 test_i <test_i|null|2|base_type|int|2>

少し複雑ですが、変数名tstr、アドレスは0x4a、サイズは3バイトの構造体で、unsigned char型のtest_cと、int型のtest_iをメンバーに持つことが読み取れます。

 

<>で挟んだ文字列は構造体メンバのTYPE属性で、複雑な構造を持つ変数のTYPE属性の解析に必要な情報を記します。この例では、メンバ変数がbase_typeなので簡単な記述に留まっていますが、メンバ変数が構造体だったり、構造体配列へのポインタだったりすると、<>の中の記述がどんどん複雑になっていきます。

 

利用するときに苦労しそうですが、面倒な心配は先送り!(<==開発の基本スタンス)

 先ずは変数名からアドレスとそのサイズを調べてPICから読み出し、バイト列で表示するところから始めます。(<==構造体メンバもバイト列で表現する)

構造体メンバーの変数表示とか、配列の型変換表示とか・・・機能拡張(<==面倒だけど多分出来る)は追々考えていきたいと思います。