compilation - 如何为 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
可能的解决方案:
这里有两个选项:
- 将 ELF 文件移交给 GDB
- 编写一个 Customer Jit-Reader 插件来处理自定义目标文件的调试。
现在我有一个自定义目标文件(只是将三个独立的部分加载到内存中)。我不想编写自己的 Jit Reader 插件。
阻塞问题:
有谁知道现有的代码可以帮助我将这三个独立的部分打包成一个简单的 ELF 文件(然后我可以通过调用__jit_debug_register_code () 向 GDB 注册)?我猜我需要做的就是编写一些标题(符合 ELF 规范),其中包含名称和指向该部分的指针。是否有现有的开源代码,或者如果没有,有人可以指点我如何自己做这个包装吗?
我需要最少的 ELF 文件,以便 GDB 满意(我不需要加载 ELF 文件,因为 .text 和 .data 部分已经加载)
解决方案
libelf
可能有助于构建 ELF 对象。有可用的开源实现:
- elftoolchain(BSD 许可)
- 精灵实用程序(GPL)。
推荐阅读
- javascript - 如何大摇大摆地拥有一系列路径?
- oracle - 具有多列的 Oracle 主键
- android - 使用 mingc/android-build-box 时如何升级到 gradle 7.*?
- python - 如何删除所有virtualenv vscode python?
- jenkins - Jenkins 需要 Java 版本 [8、11],但您使用 Java 16 从 C:\Program Files\Java\jdk-16.0.1 运行
- r - 如何使用(=元包)在双反正弦变换后对流行率估计进行反向变换
- javascript - React.suspense 如何“处理” i18next 后端加载?
- css - 为什么 2 列的左列必须向左浮动才能顶部对齐?
- twilio - 需要一次向 11K 人发送 SMS,但事先不知道余额有多少?
- laravel - OutOfBoundsException - Sentry - Jean85\PrettyVersions - Composer 更新错误 - Laravel