[英]How can I tell if a library was compiled with -g?
我在 x86 Linux 上有一些编译的库,我想快速确定它们是否使用调试符号编译。
建议的命令
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
。
如果您在Linux上运行,请使用objdump --debugging
。 库中的每个目标文件都应该有一个条目。 对于没有调试符号的目标文件,您将看到如下内容:
objdump --debugging libvoidincr.a
In archive libvoidincr.a:
voidincr.o: file format elf64-x86-64
如果有调试符号,输出将更加冗长。
nm -a <lib>
将打印库中的所有符号,包括调试符号。
因此,您可以比较nm <lib>
和nm -a <lib>
- 如果它们不同,则lib包含一些调试符号。
有用的是:
gdb mylib.so
它在未找到调试符号时打印:
Reading symbols from mylib.so...(no debugging symbols found)...done.
或者在找到时:
Reading symbols from mylib.so...done.
以前的答案都没有为我提供有意义的结果:没有调试符号的libs提供了大量输出等。
在OSX上,您可以使用dsymutil -s
和dwarfdump
。
使用dsymutil -s <lib_file> | more
您将在具有调试符号的文件中看到dsymutil -s <lib_file> | more
源文件路径,否则只会看到函数名称。
你可以使用objdump 。
编辑:从手册页:
-W
--dwarf
Displays the contents of the DWARF debug sections in the file, if
any are present.
答案建议使用objdump --debugging
或readelf --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手册中的单独调试文件 。
命令 readelf -wi 文件是对调试信息的良好验证,在您的程序中编译。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.