最佳答案
我在 gdb 的目标可执行文件之外,甚至没有与该目标对应的堆栈。无论如何,我想单步执行,这样我就可以验证汇编代码中发生了什么,因为我不是 x86汇编的专家。不幸的是,gdb 拒绝执行这个简单的程序集级调试。它允许我在适当的断点上设置和停止,但只要我尝试单步执行,gdb 就会报告错误“无法找到当前函数的界限”,EIP 也不会改变。
其他详情:
机器代码是由 gcc asm 语句生成的,我把它复制到了它正在执行的内核内存位置,从 objecdump-d 的输出。我不介意用一种简单的方法来使用加载程序将我的目标代码加载到一个重新定位的地址,但是请记住,加载必须在内核模块中完成。
我认为另一种方法是生成一个假的内核模块或调试信息文件给 gdb,使其相信这个区域在程序代码中。Gdb 在内核可执行文件本身上工作得很好。
(对于那些真正想知道的人,我在运行时将代码插入到一个 VMware VM 中的 Linux 内核数据空间中,并通过 VMware Workstation 内置的 gdb 存根从 gdb 远程调试内核。注意,我不是在编写内核开发; 我是一名正在编写原型的安全研究生。)
(我可以在程序集中的每条指令上设置断点。这种方法可以工作,但是在一段时间之后会变得相当费力,因为 x86汇编指令的大小会发生变化,而且每次重新启动时汇编的位置都会发生变化。)