揮発性のメモ2

知識をメモ書きしておく

gccで、実行バイナリとデバッグ情報を分離する

C#pdbファイルみたいに、実行バイナリとデバッグ情報を分離したい

分離手順

次のコマンドで実行バイナリ hoge からデバッグ情報を取り出し hoge.dbg として保存する

# コンパイル
gcc -g3 hoge.c -o hoge

# デバッグ情報を分離
objcopy --only-keep-debug hoge hoge.dbg

# デバッグ情報を削除
objcopy --strip-debug hoge
# デバッグ情報のファイル名を追記
objcopy --add-gnu-debuglink=hoge.dbg hoge



デバッグ情報のファイル名を追記 とは

デバッグ情報を分離すると、gdbコマンドで実行バイナリを読むときに デバッグ情報も一緒に読む必要がある。
実行バイナリにデバッグ情報のファイル名を追記することで、その手間をちょっとだけ省ける。

(gdb) file hoge
Reading symbols from hoge...
Reading symbols from /tmp/hoge.dbg...    ←自動で読まれる

実行バイナリとデバッグ情報の紐付け

コンパイルすると、BuildID という識別子が付与される。
これは fileコマンドや readelfコマンドで確認できる

$ readelf -n hoge | grep "Build ID"
    Build ID: 904a2f10b58394c9c0d30322eb36f7a41c5d4e5e

$ readelf -n hoge.dbg | grep "Build ID"
    Build ID: 904a2f10b58394c9c0d30322eb36f7a41c5d4e5e

実行バイナリとデバッグ情報ファイルのBuidIDを比較して、どれとどれが対応しているか判別できる。

BuildID は、何回コンパイルしなおしても ソースの内容が同一である限りは変化しない。 タイムスタンプとかいじってもセーフ。
コンパイルオプションを変更したりソースを1行でも変更したら変化する。

gdbデバッグ情報ファイルを読むとき、BuildIDが違ってても警告なく読めてしまうので注意する。

デバッグ情報のファイル名

なんか知らないけど .dbg という拡張子が一般的っぽい