簡體   English   中英

如何判斷一個庫是否是用 -g 編譯的?

[英]How can I tell if a library was compiled with -g?

我在 x86 Linux 上有一些編譯的庫,我想快速確定它們是否使用調試符號編譯。

建議的命令

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選項構建的

真正幫助我確定是否使用-greadelf工具:

readelf --debug-dump=decodedline libinspected.so

要么

readelf --debug-dump=line libinspected.so

這將打印出包含源文件名,行號和地址的行集, 如果這樣的調試信息包含在庫中 ,否則它將不打印任何內容

你可以傳遞你需要的任何值--debug-dump選項而不是decodedline

如果您在Linux上運行,請使用objdump --debugging 庫中的每個目標文件都應該有一個條目。 對於沒有調試符號的目標文件,您將看到如下內容:

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

voidincr.o:     file format elf64-x86-64

如果有調試符號,輸出將更加冗長。

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.

以前的答案都沒有為我提供有意義的結果:沒有調試符號的libs提供了大量輸出等。

在OSX上,您可以使用dsymutil -sdwarfdump

使用dsymutil -s <lib_file> | more 您將在具有調試符號的文件中看到dsymutil -s <lib_file> | more源文件路徑,否則只會看到函數名稱。

你可以使用objdump

編輯:從手冊頁:

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

答案建議使用objdump --debuggingreadelf --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手冊中的單獨調試文件

https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/developer_guide/debugging

命令 readelf -wi 文件是對調試信息的良好驗證,在您的程序中編譯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM