回答:
Linuxで実行している場合は、を使用しますobjdump --debugging
。ライブラリ内の各オブジェクトファイルのエントリが必要です。デバッグシンボルのないオブジェクトファイルの場合、次のように表示されます。
objdump --debugging libvoidincr.a
In archive libvoidincr.a:
voidincr.o: file format elf64-x86-64
デバッグシンボルがある場合、出力ははるかに詳細になります。
objdump -g
単純なtest.oでは何も得られませんg
。Ubuntu 12.04、gcc 4.6.3、GNU objdump 2.22。 nm -a
より便利なようです。
提案されたコマンド
objdump --debugging libinspected.a
objdump --debugging libinspected.so
Ubuntu / Linaro 4.5.2では常に同じ結果が得られます:
libinspected.a: file format elf64-x86-64
libinspected.so: file format elf64-x86-64
アーカイブ/共有ライブラリが-g
オプション付きで構築されたかどうかに関係なく
-g
使用されたかどうかを判断するのに本当に役立ったのは、readelfツールです。
readelf --debug-dump=decodedline libinspected.so
または
readelf --debug-dump=line libinspected.so
このようなデバッグ情報がライブラリに含まれている場合は、ソースファイル名、行番号、アドレスで構成される行のセットが出力されます。そうでない場合は何も出力されません。
--debug-dump
オプションではなく、必要な値を渡すことができますdecodedline
。
助けになったのは:
gdb mylib.so
デバッグシンボルが見つからない場合に出力されます。
Reading symbols from mylib.so...(no debugging symbols found)...done.
または見つかったとき:
Reading symbols from mylib.so...done.
以前の回答のどれも私にとって意味のある結果を与えていませんでした:デバッグシンボルのないライブラリは多くの出力などを与えていました。
nm -a <lib>
デバッグシンボルを含むライブラリからすべてのシンボルを印刷します。
あなたはの出力を比較できるようにnm <lib>
し、nm -a <lib>
-それらが異なる場合は、あなたのlibには、いくつかのデバッグシンボルが含まれています。
nm -a
nm --debug-syms
わかりやすいエイリアスがあります:-)。
diff <(nm <lib>) <(nm -a <lib>)
するだけで簡単に差分を取得
デバッグ情報がバイナリとは別のファイルに格納されている場合、つまり、バイナリにデバッグリンクセクションが含まれている場合に使用するobjdump --debugging
か、機能readelf --debug-dump=...
しないことを示唆する回答。おそらくそれをのバグと呼ぶことができます。readelf
次のコードはこれを正しく処理する必要があります。
# Test whether debug information is available for a given binary
has_debug_info() {
readelf -S "$1" | grep -q " \(.debug_info\)\|\(.gnu_debuglink\) "
}
詳細については、GDBマニュアルの個別のデバッグファイルを参照してください。
obdjump -W lib
ともありreadelf -w lib
ます。後者はより設定可能です-readelf(1)マンページを参照してください。