如何判断库是否使用-g编译?

时间:2010-01-04 13:52:17

标签: c debugging gdb debug-symbols

我在x86 Linux上有一些编译库,我想快速确定它们是否是用调试符号编译的。

7 个答案:

答案 0 :(得分:74)

建议的命令

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

这将打印出由源文件名,行号和地址组成的一组行,如果这样的调试信息包含在库中,否则它将打印 nothing 。 / p>

您可以传递--debug-dump选项所需的任何值,而不是decodedline

答案 1 :(得分:68)

如果您在Linux上运行,请使用objdump --debugging。库中的每个目标文件都应该有一个条目。对于没有调试符号的目标文件,您将看到如下内容:

objdump --debugging libvoidincr.a
In archive libvoidincr.a:

voidincr.o:     file format elf64-x86-64

如果有调试符号,输出将更加详细。

答案 2 :(得分:25)

nm -a <lib>将打印库中的所有符号,包括调试符号。

所以你可以比较nm <lib>nm -a <lib>的输出 - 如果它们不同,你的lib包含一些调试符号。

答案 3 :(得分:21)

有什么帮助:

gdb mylib.so

在找不到调试符号时打印:

Reading symbols from mylib.so...(no debugging symbols found)...done.

或者在找到时:

Reading symbols from mylib.so...done.

之前的答案都没有为我提供有意义的结果:没有调试符号的libs提供了大量输出等。

答案 4 :(得分:14)

在OSX上,您可以使用dsymutil -sdwarfdump

答案 5 :(得分:11)

您可以使用objdump

编辑:从手册页:

-W
--dwarf
Displays  the  contents of the DWARF debug sections in the file, if
any are present.

答案 6 :(得分:4)

如果调试信息存储在与二进制文件分开的文件中,则表示使用objdump --debuggingreadelf --debug-dump=...的答案不起作用,即二进制文件包含调试链接< / em>部分。也许有人可以称之为readelf中的错误。

以下代码应该正确处理:

# Test whether debug information is available for a given binary
has_debug_info() {
  readelf -S "$1" | grep -q " \(.debug_info\)\|\(.gnu_debuglink\) "
}

有关详细信息,请参阅GDB手册中的Separate Debug Files