好的..所以我正在使用gdb在x86上进行调试。 有问题的特定文件被剥离,所以我没有二进制文件本身的符号。我无法访问源代码,但大致了解了幕后发生的事情。
我的asm知识足以决定一个功能的目的并确定其目的。因此,在查看它们一段时间之后,我可以决定自己适当的函数名称,但我希望能够将它们作为符号注入,以便一旦决定它们就可以在以后的调试中使用..
有人知道如何将自定义符号加载到gdb中吗? 我已经考虑重新编译gdb并向UI添加一个额外的命令以允许在地址处加载符号。我想知道是否可以使用我定义的符号创建一个虚拟对象文件,然后加载它使用add-symbol-file? 或者是否可以使用虚函数编译一个c程序,那么如何强制它们在正确的位置并在正确的位置然后简单地加载???
答案 0 :(得分:2)
这听起来应该是一件容易的事,但事实证明这很令人讨厌,主要是因为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
部分的偏移量才有用(即,能够在函数上设置断点并让它出现在回溯)
此外,我无法找到任何方法来修改符号的“大小”字段。
答案 1 :(得分:0)
我不会在gdb中寻找解决方案。我会试着弄清楚如何将符号放回二进制文件。从逻辑上讲,如果可以剥离符号,则必须可以将它们添加回来。我希望链接器(ld)或其他工具允许这样做。
我建议检查binutils包中的所有工具(objdump,objcopy,nm,ld,...) - 它们能够存在许多奇迹般的东西!
托马斯