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


103

x86 Linuxでコンパイルされたライブラリがいくつかあり、それらがデバッグシンボルでコンパイルされたかどうかをすばやく確認したいと思います。

回答:


85

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

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

voidincr.o:     file format elf64-x86-64

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


5
obdjump -W libともありreadelf -w libます。後者はより設定可能です-readelf(1)マンページを参照してください。
przemoc 2010年

3
バイナリ(-gでコンパイルされたものを含む)の場合、objdumpは-gstabsでコンパイルしない限り、「認識されたデバッグ情報がありません」という応答を返します。これは認識されたバグのようです。
Dan Hook

ダン、どちらのプラットフォームでこれを試しましたか?
swegi

ロシア語を採用:man objdump(1)の--debuggingフラグは、ファイルに保存されているSTABSおよびIEEEデバッグ形式の情報を解析し、Cのような構文を使用して出力しようとします。これらの形式のいずれも見つからない場合、このオプションはフォールバックします-Wオプションで、ファイル内のDWARF情報を印刷します。」
Matt McClellan

5
objdump -g単純なtest.oでは何も得られませんg。Ubuntu 12.04、gcc 4.6.3、GNU objdump 2.22。 nm -aより便利なようです。
jw013 2013

89

提案されたコマンド

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


1
完璧に動作します。最初のCMAKE_BUILD_TYPE RELEASEを使用して実行可能ファイルでこのコマンドを試しましたが、コマンドは空を返しました。次に、CMAKE_BUILD_TYPE DEBUGを試してみたところ、かなり多くの出力がありました。
infoclogged 2017

32

助けになったのは:

gdb mylib.so

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

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

または見つかったとき:

Reading symbols from mylib.so...done.

以前の回答のどれも私にとって意味のある結果を与えていませんでした:デバッグシンボルのないライブラリは多くの出力などを与えていました。


どうも!これは:) cmakeのとアンドロイドで打ち鳴らすコンパイラを使用して、私のために働いた
パーニルスAmsen

迅速なチェックに最適!* .oオブジェクトファイルでも機能します。
ステファンRolland

28

nm -a <lib> デバッグシンボルを含むライブラリからすべてのシンボルを印刷します。

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


3
@ロシア語採用これについて詳しく教えてください。なぜそれが間違ったツールだと思いますか?それは仕事をします、そしてLinuxでもそれをします。
qrdl

カーネル2.6.35、xxx-objdump、xxx-nmに基づく組み込みLinuxでも正常に機能します。
agfe2

nm -anm --debug-symsわかりやすいエイリアスがあります:-)。
pevik

3
入力diff <(nm <lib>) <(nm -a <lib>)するだけで簡単に差分を取得
A

17

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

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


11
たとえば、出力で何を探すかについての詳細を提供できますdsymutil -sか?出力の存在は、デバッグシンボルでビルドされたことを意味しますか、それともgrepする必要がありますか?
ミッチ

12

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

編集:マンページから:

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

6

デバッグ情報がバイナリとは別のファイルに格納されている場合、つまり、バイナリにデバッグリンクセクションが含まれている場合に使用する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マニュアルの個別のデバッグファイルを参照してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.