debugging 如果没有file,objdump或gdb,如何知道二进制文件是否包含调试符号?

ax6ht2ek  于 2023-03-03  发布在  其他
关注(0)|答案(3)|浏览(218)

我需要知道一个二进制文件中是否有调试符号。它是一个生产系统,所以没有像fileobjdumpgdb这样的命令。
可以在需要时提供更多信息。
操作系统:Linux

ghg1uchk

ghg1uchk1#

您可能正在寻找类似***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可能会帮助更多

qncylg1j

qncylg1j2#

如果您不知道二进制文件是否有符号,并且在安装二进制文件的实际机器上没有工具,那么简单的解决方案是使用类似scp(安全远程复制)的方法将文件复制到具有工具的机器上。
正如另一条评论所说,使用strings命令,它会打印任何“看起来像字符串”的东西(足够长的“可打印”字符序列),但它并不那么可靠,因为您永远不知道调试符号是什么样子的,并且您可能会从包含宏等符号的代码中得到误报。

kxxlusnw

kxxlusnw3#

最棒的是,带上一些工具!
如果你不能,那么你应该知道二进制文件的格式,在Linux系统上,它是ELF...你可以检查找到像.symtab.debug_这样的部分。
如果它们存在,那么你的二进制文件中就有了所有的符号。
另一个想法是植入一些符号(例如my_check_symbol_to_see),然后grep这个符号...

相关问题