我怎么知道一个库是用-g编译的?


103

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

Answers:


85

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

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

voidincr.o:     file format elf64-x86-64

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


5
也有obdjump -W libreadelf -w lib。后者更可配置-请参见readelf(1)联机帮助页。
przemoc

3
对于任何二进制文件(包括使用-g编译的二进制文件),除非我使用-gstabs进行编译,否则objdump会给出“没有公认的调试信息”的响应。这似乎是一个公认的错误。
Dan Hook 2010年

丹,您在哪个平台上尝试过?
swegi 2010年

使用俄语:从man objdump(1)开始,-debugging标志“试图解析存储在文件中的STABS和IEEE调试格式信息,并使用类似C的语法将其打印出来。如果找不到这两种格式,则此选项回退在-W选项上打印文件中的所有DWARF信息。”
马特·麦克莱伦

5
objdump -g一个简单的test.o并没有给我任何帮助g。Ubuntu 12.04,gcc 4.6.3,GNU objdump 2.22。 nm -a似乎更有用。
jw013 2013年

89

建议的命令

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

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

您可以传递--debug-dump选择所需的任何值代替decodedline


1
完美地工作。我在第一个CMAKE_BUILD_TYPE RELEASE上的可执行文件上尝试了此命令,该命令返回空值。然后我尝试使用CMAKE_BUILD_TYPE DEBUG,然后有很多输出。
阻塞

32

帮助的是:

gdb mylib.so

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

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

或发现时:

Reading symbols from mylib.so...done.

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


谢谢!这个工作对我来说,这是Android与cmake的:)使用铛编译器
PAR尼尔斯Amsen

超级棒的快速检查!也适用于* .o目标文件。
Stephane Rolland

28

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

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


3
@Employed Russian您能详细说明一下吗?您为什么认为它是错误的工具?它可以完成这项工作,也可以在Linux上完成。
qrdl 2010年

即使对于基于内核2.6.35的嵌入式Linux,xxx-objdump,xxx-nm也可以正常工作。
agfe2 2014年

nm -a别名nm --debug-syms是不言自明的:-)。
pevik

3
只需输入diff <(nm <lib>) <(nm -a <lib>)得到一个简单的差异
Aᴄʜᴇʀᴏɴғᴀɪʟ

17

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

使用,dsymutil -s <lib_file> | more您将看到带有调试符号的文件中的源文件路径,否则只有函数名。


11
例如,您能否详细说明在输出中寻找什么dsymutil -s?输出的存在是否意味着它是用调试符号构建的,还是应该将其grepped?
米奇

12

您可以为此使用objdump

编辑:从手册页:

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

6

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

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

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

有关更多信息,请参见GDB手册中的单独的调试文件

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.