x86 Linux でコンパイルしたライブラリがいくつかあり、それらがデバッグ シンボルを使用してコンパイルされているかどうかをすばやく判断したいと考えています。
7 に答える
提案されたコマンド
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 にデバッグ シンボルが含まれています。
これにはobjdumpを使用できます。
編集:マンページから:
-W
--dwarf
Displays the contents of the DWARF debug sections in the file, if
any are present.
デバッグ情報がバイナリとは別のファイルに保存されている場合、つまりバイナリにデバッグ リンクセクションが含まれている場合の使用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 マニュアルの個別のデバッグ ファイルを参照してください。