如果没有文件、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 【问题描述】:

我需要知道二进制文件中是否包含调试符号。它是一个生产系统,因此没有像 fileobjdumpgdb 这样的命令。

可以在需要时提供更多信息。

操作系统: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 反汇编一个函数?

GIS Default.gdb有用吗 可以删除吗

使用 objdump 或 gcc -c 将汇编指令转换为二进制

如何使用 gdb 调试 GUI 程序

ELF二进制分析静态与动态。汇编代码如何?指令内存映射的变化?

GDB:断点没有被命中