如果没有文件、objdump 或 gdb,如何知道二进制文件是不是包含调试符号?
Posted
技术标签:
【中文标题】如果没有文件、objdump 或 gdb,如何知道二进制文件是不是包含调试符号?【英文标题】:how to know if a binary contains debugging symbols or not without file, objdump or gdb?如果没有文件、objdump 或 gdb,如何知道二进制文件是否包含调试符号? 【发布时间】:2013-07-03 16:23:52 【问题描述】:我需要知道二进制文件中是否包含调试符号。它是一个生产系统,因此没有像 file
或 objdump
或 gdb
这样的命令。
可以在需要时提供更多信息。
操作系统:Debian
【问题讨论】:
将文件复制到有工具分析文件的机器上? 是的,有可能……让我试试吧。 谢谢@MatsPetersson .. 这真的很有帮助。请将其发布为答案。strings
命令也很方便。
@meaning-matters,请解释strings
将如何提供帮助。它在系统中可用。
【参考方案1】:
您可能正在寻找像 objdump
这样的工具假设我们有一个这样的小程序
#include <stdio.h>
int main()
printf("Hello ");
return 0;
现在正常编译
gcc example.c -o example
现在让我们使用 objdump 工具检查是否存在调试符号
objdump -h example | grep debug
我们当然不会找到任何东西
现在让我们用调试选项编译再试一次
gcc -g example.c -o example
objdump -h example | grep debug
26 .debug_aranges 00000030 0000000000000000 0000000000000000 000008b0 2**0
27 .debug_pubnames 0000001b 0000000000000000 0000000000000000 000008e0 2**0
28 .debug_info 0000008b 0000000000000000 0000000000000000 000008fb 2**0
29 .debug_abbrev 0000003f 0000000000000000 0000000000000000 00000986 2**0
30 .debug_line 0000003f 0000000000000000 0000000000000000 000009c5 2**0
31 .debug_str 00000087 0000000000000000 0000000000000000 00000a04 2**0
32 .debug_pubtypes 00000012 0000000000000000 0000000000000000 00000a8b 2**0
man -a objdump 可能会有更多帮助
【讨论】:
【参考方案2】:如果您不知道二进制文件是否有符号并且您拥有二进制文件的实际机器上没有工具,那么简单的解决方案是使用scp
(安全远程复制)之类的东西进行复制文件到有工具的机器上。
正如另一条评论所说,使用strings
命令,它会打印任何它发现的“看起来像字符串”(足够长的“可打印”字符序列),但它并不像你从来没有的那么可靠真的知道调试符号是什么样子的,你可以从包含宏等符号的代码中得到误报。
【讨论】:
此外,还有很多不是符号的错误和日志条目字符串...这不太可能。【参考方案3】:最重要的是,随身携带一些工具!
如果你不能,那么你应该知道二进制的格式,
在 Linux 系统上,它是 ELF ...
您可以查看".strtab"
和".symtab"
。
如果它们存在,那么您的二进制文件中就有所有符号。
另一个想法,是种植一些符号(例如my_check_symbol_to_see
)
然后grep这个符号...
【讨论】:
以上是关于如果没有文件、objdump 或 gdb,如何知道二进制文件是不是包含调试符号?的主要内容,如果未能解决你的问题,请参考以下文章
使用 objdump 或 gcc -c 将汇编指令转换为二进制