如何判断一个库是否用-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 -sdwarfdump

什么帮助是:

 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 --debuggingreadelf --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文件以获取更多信息。