问题描述
背景:
我正在生成 JIT 代码(生成 x86-64 代码)。在 JIT 过程结束后,我生成了一个 .text 部分、一个 .data 部分和一个 .eh_frame 部分(.eh_frame 用于堆栈展开)。我能够成功执行此 JIT 代码。但问题是 GDB。我希望能够使用 GDB 调试此 JIT 代码(特别是 GDB 的“backtrace”命令应该可以工作)。
问题:
我需要将这个加载的 JIT 代码告诉 GDB(特别是我需要告诉 GDB 关于 .eh_frame 以便它可以使用该框架进行堆栈展开)。我看到 GDB 有一个 JIT 接口:https://sourceware.org/gdb/current/onlinedocs/gdb/JIT-Interface.html
可能的解决方案:
这里有两个选项:
现在我有一个自定义目标文件(只是加载到内存中的三个独立部分)。我不想编写自己的 Jit Reader 插件。
阻塞问题:
有谁知道现有的代码可以帮助我将这三个独立的部分打包成一个简单的 ELF 文件(然后我可以通过调用 __jit_debug_register_code() 向 GDB 注册该文件)?我猜我需要做的就是编写一些标题(符合 ELF 规范),其中包含指向该部分的名称和指针。是否有现有的开源代码,或者如果没有,有人可以指出我如何自己做这个包装吗?
我需要最少的 ELF 文件,以便 GDB 满意(我不需要加载 ELF 文件,因为 .text 和 .data 部分已经加载)
解决方法
libelf
可能有助于构建 ELF 对象。有可用的开源实现:
- elftoolchain(BSD 许可)
- elfutils (GPL)。