首页 > 解决方案 > 如何为 GDB 的 JIT 代码生成 ELF 文件格式?

问题描述

背景:

我正在生成 JIT 代码(生成 x86-64 代码)。在 JIT 过程结束后,我生成了一个 .text 部分、一个 .data 部分和一个 .eh_frame 部分(.eh_frame 用于堆栈展开)。我能够成功执行此 JIT 代码。但问题是 GDB。我希望能够使用 GDB 调试这个 JIT 代码(特别是 GDB 的“回溯”命令应该可以工作)。

问题:

我需要告诉 GDB 这个加载的 JIT 代码(特别是我需要告诉 GDB .eh_frame 以便它可以使用该帧进行堆栈展开)。我看到 GDB 有一个 JIT 接口:https ://sourceware.org/gdb/current/onlinedocs/gdb/JIT-Interface.html

可能的解决方案:

这里有两个选项:

  1. 将 ELF 文件移交给 GDB
  2. 编写一个 Customer Jit-Reader 插件来处理自定义目标文件的调试。

现在我有一个自定义目标文件(只是将三个独立的部分加载到内存中)。我不想编写自己的 Jit Reader 插件。

阻塞问题:

有谁知道现有的代码可以帮助我将这三个独立的部分打包成一个简单的 ELF 文件(然后我可以通过调用__jit_debug_register_code () 向 GDB 注册)?我猜我需要做的就是编写一些标题(符合 ELF 规范),其中包含名称和指向该部分的指针。是否有现有的开源代码,或者如果没有,有人可以指点我如何自己做这个包装吗?

我需要最少的 ELF 文件,以便 GDB 满意(我不需要加载 ELF 文件,因为 .text 和 .data 部分已经加载)

标签: compilationgdbelfjitdwarf

解决方案


libelf可能有助于构建 ELF 对象。有可用的开源实现:


推荐阅读