gdb - 在 gdb 中为文件添加自己的符号

标签 gdb symbols elf

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

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

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

最佳答案

这听起来应该是一件容易的事,但结果却令人惊讶地烦人,主要是因为 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 的偏移量。有用的部分(即,能够在函数上设置断点并让它出现在回溯中)

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

关于gdb - 在 gdb 中为文件添加自己的符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5488322/

相关文章:

ruby - : mean in rails before a variable name? 是什么

ruby-on-rails - Ruby 中的符号和变量有什​​么区别?

c - 如何获取结构 "Elf64_Rela"中的符号名称

c - 释放内存时如何在 gdb 中得到通知?

c++ - 在调试器内的 OS X 上启动 C++ 命令行工具的简单方法

python - 如何分析 python 进程的内存使用情况?

linux - 将运行Linux进程中的内存地址范围转换为目标文件中的符号?

assembly - 如何在气体汇编代码中导出类型为 "FUNC"和 "GLOBAL"的符号?

linux - 我的 Linux 可执行程序中的段 00 是什么(64 位)

c - 在 GDB 中打印字符数组到文件