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 という拡張子が一般的っぽい