我在x86 Linux上有一些编译好的库,我希望能快速确定它们是否使用了调试符号。
我在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
如果存在调试符号,输出信息会更加冗长。
obdjump -W lib
和readelf -w lib
两种命令。后者更加可配置,详见readelf(1)
手册页。 - przemocobjdump -g
命令对编译了g
和未编译g
的简单测试文件test.o进行反汇编,结果为空,因此该命令无效。在Ubuntu 12.04系统、gcc 4.6.3编译器和GNU objdump 2.22版本下,使用nm -a
命令似乎更加有用。 - jw013nm -a
命令看起来更可靠。 - pevik有帮助的是:
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>
的输出进行比较,如果它们不同,则表示您的库文件中包含一些调试符号。
nm -a
有别名 nm --debug-syms
,这个别名已经很明显了 :-)。 - pevikdiff <(nm <lib>) <(nm -a <lib>)
即可轻松获取差异。 - Aᴄʜᴇʀᴏɴғᴀɪʟdsymutil -s
和dwarfdump
。dsymutil -s <lib_file> | more
,您将在具有调试符号的文件中看到源文件路径,但仅查看函数名称的其他文件。dsymutil -s
的输出中应该看到哪些内容?输出的存在是否表示已经启用了调试符号,或者需要使用grep命令来查找? - Mitch您可以使用objdump进行此操作。
编辑:来自手册页面:
-W
--dwarf
Displays the contents of the DWARF debug sections in the file, if
any are present.
objdump
中工作:错误:未知参数'--dwarf'
。 - user3064538建议使用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 -S example | grep debug
更好。使用 readelf --debug-dump=links example | grep link
可以找到链接文件(GNU readelf 版本为 2.31.1-13.fc29)。 - Nick Dong