好的..所以我正在使用gdb在x86上进行调试.有问题的特定文件被剥离,所以我没有二进制本身的符号.我无法访问源代码,但大致了解了幕后发生的事情.
我的asm知识足以决定一个函数的用途并决定它的用途.因此,我可以在查看它们一段时间后决定我自己适当的函数名称,但我希望能够将它们作为符号注入,以便一旦确定它们就可以在以后的调试中使用.
有人知道如何将自定义符号加载到gdb中吗?我已经考虑重新编译gdb并向UI添加一个额外的命令以允许在地址处加载符号.我想知道是否可以使用我定义的符号创建一个虚拟对象文件,然后加载它使用add-symbol-file?或者是否可以编译带有虚函数的交流程序,那么如何强制它们在正确的大小和正确的位置,然后简单地加载?
这听起来应该是一项简单的任务,但事实证明它令人惊讶地烦人,主要是因为 ELF 作为一种文件格式生成起来很烦人,所以大多数工具都满足于解析它。
如此处所述,GDB 从两个位置读取符号信息,首先从.symtab和/或部分中的符号读取一些最小信息.dynsym,然后从该.debug_info部分(如果存在)中读取更详细的信息。
这立即建议了两种可能的添加信息的方法,要么添加符号.symtab,要么生成您自己的包含符号的 DWARF 信息。
然而,从头开始生成 DWARF 似乎是一个非常不常见的用例,因此到目前为止我发现的唯一有效方法是将objcopy符号添加到二进制文件本身:
objcopy a.out --add-symbol function_name=.text:0x900,function,global a.out2
Run Code Online (Sandbox Code Playgroud)
请注意,gdb 不喜欢函数的绝对符号,我必须将其指定为.text有用的部分的偏移量(即,能够在函数上设置断点并使其出现在回溯中)
另外,我无法找到任何方法来修改符号的“大小”字段。
我不会在 gdb 中寻找解决方案。相反,我会尝试弄清楚如何将符号放回二进制文件中。从逻辑上讲,如果可以删除符号,那么也一定可以将它们添加回来。我希望链接器(ld)或其他一些工具能够允许这样做。
我建议检查 binutils 包中的所有工具(objdump、objcopy、nm、ld...) - 它们能够完成许多几乎神奇的事情!
托马斯