[英]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
選項構建的
真正幫助我確定是否使用-g
是readelf工具:
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 -s
和dwarfdump
。
使用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 --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手冊中的單獨調試文件 。
命令 readelf -wi 文件是對調試信息的良好驗證,在您的程序中編譯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.