X86 Linuxにはいくつかのコンパイル済みライブラリがあり、それらがデバッグシンボルを使用してコンパイルされたかどうかをすぐに判断したいと思います。
Linuxで実行している場合は、objdump --debugging
を使用します。ライブラリ内のオブジェクトファイルごとにエントリが必要です。デバッグシンボルのないオブジェクトファイルの場合、次のように表示されます。
objdump --debugging libvoidincr.a
In archive libvoidincr.a:
voidincr.o: file format elf64-x86-64
デバッグシンボルがある場合、出力はより詳細になります。
提案されたコマンド
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
これは、ソースファイル名、行番号、およびアドレスで構成される行のセットを出力します(そのようなデバッグ情報がライブラリに含まれている場合、そうでない場合は印刷しますnothing。
decodedline
の代わりに--debug-dump
オプションに必要な値を渡すことができます。
nm -a <lib>
は、デバッグシンボルを含むライブラリのすべてのシンボルを出力します。
したがって、nm <lib>
とnm -a <lib>
の出力を比較できます-それらが異なる場合、libにはデバッグシンボルが含まれています。
助けたのは:
gdb mylib.so
デバッグシンボルが見つからない場合に出力されます。
Reading symbols from mylib.so...(no debugging symbols found)...done.
または、見つかった場合:
Reading symbols from mylib.so...done.
以前の回答では、意味のある結果は得られませんでした。デバッグシンボルのないライブラリは、大量の出力などを与えていました。
OSXでは、dsymutil -s
およびdwarfdump
を使用できます。
dsymutil -s <lib_file> | more
を使用すると、デバッグシンボルを持つファイルのソースファイルパスが表示されますが、それ以外の場合は関数名のみが表示されます。
これには objdump を使用できます。
編集:マンページから:
-W
--dwarf
Displays the contents of the DWARF debug sections in the file, if
any are present.
デバッグ情報がバイナリとは別のファイルに保存されている場合、つまりバイナリにdebugリンクが含まれている場合、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マニュアルの Separate Debug Files を参照してください。