web-dev-qa-db-ja.com

ライブラリが-gでコンパイルされたかどうかはどうすればわかりますか?

X86 Linuxにはいくつかのコンパイル済みライブラリがあり、それらがデバッグシンボルを使用してコンパイルされたかどうかをすぐに判断したいと思います。

91
Dan Hook

Linuxで実行している場合は、objdump --debuggingを使用します。ライブラリ内のオブジェクトファイルごとにエントリが必要です。デバッグシンボルのないオブジェクトファイルの場合、次のように表示されます。

objdump --debugging libvoidincr.a
In archive libvoidincr.a:

voidincr.o:     file format elf64-x86-64

デバッグシンボルがある場合、出力はより詳細になります。

74
Matt McClellan

提案されたコマンド

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オプションに必要な値を渡すことができます。

81
Alex InTechno

nm -a <lib>は、デバッグシンボルを含むライブラリのすべてのシンボルを出力します。

したがって、nm <lib>nm -a <lib>の出力を比較できます-それらが異なる場合、libにはデバッグシンボルが含まれています。

25
qrdl

助けたのは:

gdb mylib.so

デバッグシンボルが見つからない場合に出力されます。

Reading symbols from mylib.so...(no debugging symbols found)...done.

または、見つかった場合:

Reading symbols from mylib.so...done.

以前の回答では、意味のある結果は得られませんでした。デバッグシンボルのないライブラリは、大量の出力などを与えていました。

24
Velkan

OSXでは、dsymutil -sおよびdwarfdumpを使用できます。

dsymutil -s <lib_file> | moreを使用すると、デバッグシンボルを持つファイルのソースファイルパスが表示されますが、それ以外の場合は関数名のみが表示されます。

14
glennr

これには objdump を使用できます。

編集:マンページから:

-W
--dwarf
Displays  the  contents of the DWARF debug sections in the file, if
any are present.
11
swegi

デバッグ情報がバイナリとは別のファイルに保存されている場合、つまりバイナリに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 を参照してください。

4
ack