Answers:
如果您在Linux上运行,请使用objdump --debugging
。库中的每个目标文件都应有一个条目。对于没有调试符号的目标文件,您将看到类似以下内容的内容:
objdump --debugging libvoidincr.a
In archive libvoidincr.a:
voidincr.o: file format elf64-x86-64
如果有调试符号,则输出将更加详细。
objdump -g
一个简单的test.o并没有给我任何帮助g
。Ubuntu 12.04,gcc 4.6.3,GNU objdump 2.22。 nm -a
似乎更有用。
建议的命令
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
。
帮助的是:
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>
-如果他们不同,你的LIB包含了一些调试符号。
nm -a
别名nm --debug-syms
是不言自明的:-)。
diff <(nm <lib>) <(nm -a <lib>)
得到一个简单的差异
在将调试信息存储在与二进制文件不同的文件中的情况下,建议使用objdump --debugging
或readelf --debug-dump=...
不起作用的答案,即二进制文件包含调试链接部分。也许有人可以称它为bug readelf
。
以下代码应正确处理此问题:
# Test whether debug information is available for a given binary
has_debug_info() {
readelf -S "$1" | grep -q " \(.debug_info\)\|\(.gnu_debuglink\) "
}
有关更多信息,请参见GDB手册中的单独的调试文件。
obdjump -W lib
和readelf -w lib
。后者更可配置-请参见readelf(1)联机帮助页。