【问题标题】:Adding own symbols for file in gdb在 gdb 中为文件添加自己的符号
【发布时间】:2011-07-26 04:34:10
【问题描述】:

好的..所以我正在使用 gdb 在 x86 上进行调试。 有问题的特定文件被剥离,所以我没有来自二进制文件本身的符号。我无法访问源代码,但对幕后发生的事情有一个粗略的了解。

我的 asm 知识几乎足以决定一个函数的用途并决定它的用途。因此,我可以在查看一段时间后为函数确定合适的名称,但我希望能够将它们作为符号注入,以便一旦确定它们就可以在以后的调试中使用..

有人知道如何将自定义符号加载到 gdb 中吗? 我考虑过重新编译 gdb 并向 UI 添加一个额外的命令,以允许在地址处加载符号。我想知道是否可以使用我定义的符号创建一个虚拟对象文件,然后加载它使用添加符号文件? 或者是否可以编译一个带有虚拟函数的 c 程序,那么如何强制它们具有正确的大小和正确的位置,然后简单地加载它??

【问题讨论】:

标签: gdb symbols elf


【解决方案1】:

这听起来应该是一件容易的事,但结果却令人惊讶地烦人,主要是因为 ELF 作为一种文件格式生成起来很烦人,所以大多数工具都满足于解析它。

here 所述,GDB 从两个位置读取符号信息,首先从.symtab 和/或.dynsym 部分中的符号中获取一些最小信息,然后从.debug_info 部分中获取更多详细信息,如果它存在。

这立即提出了两种添加信息的可能方法,将符号添加到 .symtab 或生成您自己的包含符号的 DWARF 信息。

然而,从头开始生成 DWARF 似乎是一个非常不常见的用例,所以到目前为止我发现的唯一可行的方法是使用 objcopy 将符号添加到二进制文件本身:

objcopy a.out --add-symbol function_name=.text:0x900,function,global a.out2

请注意,gdb 不喜欢函数的绝对符号,我必须将其指定为 .text 部分的偏移量才能有用(即,能够在函数上设置断点并让它出现在回溯中)

另外,我找不到任何方法来修改符号的“大小”字段。

【讨论】:

    【解决方案2】:

    我不会在 gdb 中寻找解决方案。相反,我会尝试弄清楚如何将符号放回二进制文件。从逻辑上讲,如果可以去除符号,则必须可以将它们添加回来。我希望链接器 (ld) 或其他一些工具允许这样做。

    我建议检查 binutils 包中的所有工具(objdump、objcopy、nm、ld、...)——它们能够完成许多几乎神奇的事情!

    托马斯

    【讨论】:

    • ld 确实有一个 --defsym 选项。所以我会在一个虚拟 a.out(比如 ld a.out --defsym 不管=0x1111)上做,然后通过 add-symbol-file 加载它
    • 但是那不加函数符号,只加绝对符号
    猜你喜欢
    • 1970-01-01
    • 2013-12-21
    • 2012-08-09
    • 2015-01-26
    • 2014-10-26
    • 1970-01-01
    • 1970-01-01
    • 2012-09-13
    • 2017-07-27
    相关资源
    最近更新 更多