114

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

4

7 回答 7

98

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

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

voidincr.o:     file format elf64-x86-64

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

于 2010-01-04T14:02:08.983 回答
95

建议的命令

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

如果此类调试信息包含在 library中,这将打印出由源文件名、行号和地址组成的一组行,否则它将不打印任何内容

您可以传递您认为必要的任何值--debug-dumpoption 而不是decodedline.

于 2012-10-09T14:04:22.640 回答
46

有帮助的是:

gdb mylib.so

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

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

或者找到时:

Reading symbols from mylib.so...done.

早期的答案都没有给我带来有意义的结果:没有调试符号的库提供了大量的输出,等等。

于 2016-06-06T10:02:29.917 回答
31

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

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

于 2010-01-04T13:56:24.220 回答
18

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

使用dsymutil -s <lib_file> | more您将在具有调试符号的文件中看到源文件路径,但除此之外只有函数名称。

于 2013-08-28T20:41:57.537 回答
12

您可以为此使用objdump 。

编辑:从手册页:

-W
--dwarf
Displays  the  contents of the DWARF debug sections in the file, if
any are present.
于 2010-01-04T13:55:47.403 回答
8

在调试信息存储在与二进制文件分开的文件中(即二进制文件包含调试链接部分)的情况下,建议使用objdump --debuggingreadelf --debug-dump=...不工作的答案。也许有人可以称其为.readelf

以下代码应正确处理此问题:

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

有关详细信息,请参阅GDB 手册中的单独调试文件

于 2016-09-14T00:06:06.507 回答