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

我在 x86Linux 上有一些已编译的库,我想快速确定它们是否使用调试符号进行编译。

69833 次浏览

您可以使用 Objecdump进行此操作。

编辑: 来自手册页:

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

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

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

If you're running on Linux, use objdump --debugging. There should be an entry for each object file in the library. For object files without debugging symbols, you'll see something like:

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


voidincr.o:     file format elf64-x86-64

如果有调试符号,则输出将更加冗长。

建议的命令

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

no matter whether the archive/shared library was built with or without -g option

What really helped me to determine whether -g was used is readelf tool:

readelf --debug-dump=decodedline libinspected.so

or

readelf --debug-dump=line libinspected.so

这将打印出一组由源文件名、行号和地址 如果这样的调试信息包含到库中组成的行,否则它将打印 没什么

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

在 OSX 上你可以使用 dsymutil -sdwarfdump

使用 dsymutil -s <lib_file> | more,您将在具有调试符号的文件中看到源文件路径,但在其他情况下只看到函数名。

What helped is:

gdb mylib.so

当找不到调试符号时,它将打印:

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

或者发现时:

Reading symbols from mylib.so...done.

None of earlier answers were giving meaningful results for me: libs without debug symbols were giving lots of output, etc.

如果调试信息存储在与二进制文件分开的文件中,也就是说二进制文件包含一个 debug link节,那么建议使用 objdump --debuggingreadelf --debug-dump=...的答案就不起作用。也许在 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 手册中的 单独的调试文件

Https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/developer_guide/debugging

Readself-wi 命令可以很好地验证在程序中编译的 debug 信息。