DWARF の行情報を読む

DWARF の行情報を読むのをWindowsでやってみた。ELFをPEにしただけ。
http://github.com/firewood/test/blob/master/addr2line.cpp

今のMinGW-GCCデバッグ情報はDWARF2がデフォルトのようで*1、-gをつけると.debug_lineが付加されるようになる。*2

PEだとIMAGE_SECTION_HEADER内のセクション名には8文字しか入らず、ポインタらしき名前がついている。バイナリの末尾に文字列テーブルがあるが、そこのオフセット値がどこに格納されてるかわからなかったので、とりあえずきめうちで/61をダンプするようにした。

これの実行結果は

extern int printf(const char *, ...);
int main(int argc, char *argv[]) 
{
    printf("Hello, world.\n");
    return 0;
}

こんな感じになった。

hello.c:3: 004013F0
hello.c:3: 00401401
hello.c:4: 00401406
hello.c:5: 00401412
hello.c:6: 00401417
hello.c:6: 00401420

ちょっとがんばればVC++の「混合モードを表示」みたいなのができる。超がんばればデバッガも作れる…かもしれない。

*1:以前はstabsのみサポートだった気がする

*2:例外のスタック巻き戻し方式でSJLJとDWARF2があるが、いずれもデフォルトは-gdwarf2のようである