如何判断一个库是否用-g编译?
我在x86 Linux上有一些编译库,我想快速确定它们是否用debugging符号编译。
如果你在Linux上运行,使用objdump --debugging
。 库中的每个对象文件都应该有一个条目。 对于没有debugging符号的对象文件,您会看到如下所示的内容:
objdump --debugging libvoidincr.a In archive libvoidincr.a: voidincr.o: file format elf64-x86-64
如果有debugging符号,输出将更加冗长。
build议的命令
objdump --debugging libinspected.a objdump --debugging libinspected.so
至less在Ubuntu / Linaro 4.5.2上给我总是一样的结果:
libinspected.a: file format elf64-x86-64 libinspected.so: file format elf64-x86-64
无论归档/共享库是使用或不使用-g
选项构build的
真正帮助我确定是否使用-g
是readelf工具:
readelf --debug-dump=decodedline libinspected.so
要么
readelf --debug-dump=line libinspected.so
如果这样的debugging信息包含在库中 ,这将打印出由源文件名,行号和地址组成的行,否则它将不打印任何内容 。
你可以传递你所需要的任何值--debug-dump
选项而不是decodedline
。
nm -a <lib>
将打印库中的所有符号,包括debugging符号。
所以你可以比较nm <lib>
和nm -a <lib>
– 如果它们不同,你的lib包含一些debugging符号。
在OSX上,您可以使用dsymutil -s
和dwarfdump
。
什么帮助是:
gdb mylib.so
当找不到debugging符号时打印:
Reading symbols from mylib.so...(no debugging symbols found)...done.
或者当发现:
Reading symbols from mylib.so...done.
以前的答案都没有给我有意义的结果:没有debugging符号的库提供了大量的输出等等。
你可以使用objdump来做到这一点。
编辑:从手册页:
-W --dwarf Displays the contents of the DWARF debug sections in the file, if any are present.
build议使用objdump --debugging
或readelf --debug-dump=...
在debugging信息存储在与二进制文件分离的文件(即二进制文件包含debugging链接部分)的情况下不起作用。 也许有人可能会说这是一个readelf
的bug。
以下代码应该正确处理这个问题:
# Test whether debug information is available for a given binary has_debug_info() { readelf -S "$1" | grep -q " \(.debug_info\)\|\(.gnu_debuglink\) " }
请参阅GDB手册中的独立debugging文件以获取更多信息。