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

Dan*_*ook 95 c debugging gdb debug-symbols

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

Ale*_*hno 82

建议的命令

objdump --debugging libinspected.a
objdump --debugging libinspected.so
Run Code Online (Sandbox Code Playgroud)

至少在Ubuntu/Linaro 4.5.2上给我总是相同的结果:

libinspected.a:     file format elf64-x86-64
libinspected.so:     file format elf64-x86-64
Run Code Online (Sandbox Code Playgroud)

无论存档/共享库是使用还是不使用-g选项构建的

真正帮助我确定是否-g使用的是readelf工具:

readelf --debug-dump=decodedline libinspected.so
Run Code Online (Sandbox Code Playgroud)

要么

readelf --debug-dump=line libinspected.so
Run Code Online (Sandbox Code Playgroud)

这将打印出包含源文件名,行号和地址的行集,如果这样的调试信息包含在库中,否则它将不打印任何内容.

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


Mat*_*lan 76

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

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

voidincr.o:     file format elf64-x86-64
Run Code Online (Sandbox Code Playgroud)

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

  • 还有`obdjump -W lib`和`readelf -w lib`.后者更易于配置 - 请参阅readelf(1)联机帮助页. (5认同)
  • `objdump -g`没有给我一个简单的test.o编译有和没有`g`,使它实际上无用.Ubuntu 12.04,gcc 4.6.3,GNU objdump 2.22.`nm -a`似乎更有用. (5认同)
  • 对于任何二进制文件(包括用-g编译的那些),objdump给出了"无法识别的调试信息"的响应,除非我用-gstabs编译它.这似乎是一个公认的错误. (3认同)

Vel*_*kan 26

有用的是:

gdb mylib.so
Run Code Online (Sandbox Code Playgroud)

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

Reading symbols from mylib.so...(no debugging symbols found)...done.
Run Code Online (Sandbox Code Playgroud)

或者在找到时:

Reading symbols from mylib.so...done.
Run Code Online (Sandbox Code Playgroud)

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


qrd*_*rdl 25

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

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

  • @Employed俄罗斯你能详细说明吗?为什么你认为这是一个错误的工具?它完成了这项工作,并且也在Linux上完成. (3认同)
  • 只需键入`diff <(nm <lib>)<(nm -a <lib>)`即可轻松实现差异化 (3认同)

gle*_*nnr 14

在OSX上你可以使用dsymutil -sdwarfdump.

  • 您能否详细说明在输出中查找的内容,例如`dsymutil -s`?输出的存在是否意味着它是使用调试符号构建的,还是应该是grepped? (10认同)

swe*_*egi 11

你可以使用objdump.

编辑:从手册页:

-W
--dwarf
Displays  the  contents of the DWARF debug sections in the file, if
any are present.
Run Code Online (Sandbox Code Playgroud)


ack*_*ack 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\) "
}
Run Code Online (Sandbox Code Playgroud)

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