它是可能的使用GNU工具(海湾合作委员会,binutils,等等)的修改所有事件的大会指令变成一个没有-op?具体而言,海湾合作委员会的-pg选产生的下列组件(臂):

   0x0: e1a0c00d    mov ip, sp
   0x4: e92dd800    stmdb   sp!, {fp, ip, lr, pc}
   0x8: e24cb004    sub fp, ip, #4  ; 0x4
   0xc: ebfffffe    bl  0 <mcount>

我想要记录的地址这一最后的指令,然后将它改为一个nop像在下面的代码

   0x0: e1a0c00d    mov ip, sp
   0x4: e92dd800    stmdb   sp!, {fp, ip, lr, pc}
   0x8: e24cb004    sub fp, ip, #4  ; 0x4
   0xc: e1a00000    nop         (mov r0,r0)

Linux内核可以做的东西与此类似,在运行时间,但是我在寻找一个建立时的解决方案。

有帮助吗?

解决方案

这肯定会更容易与RISC上下的固定长度的指令格式,比如x86。

它应该比较简单的使用libelf(好教程: http://people.freebsd.org/~jkoshy/download/libelf/article.html)或libbfd(http://sourceware.org/binutils/docs-2.19/bfd/index.html)开的对象文件,修改的指示之内。文字部分,并把它写出来再次使用提供Api。是否值得的努力,或不将取决于非技术考虑因素(我有点好奇的,但...).

值得一提的是,可能有几条皱纹与使用libelf或libbfd如果这一工作需要在一个十字发展的环境。

其他提示

可以与gcc -S输出一个汇编列表编译而不是完全编译成目标文件或可执行的代码。然后,只需更换用空操作(例如,使用sed)所需的指令,并从那里继续编译。

如果您也想为目标文件或库,你没有原始的源代码为做到这一点,你就不是必须使用的工具如的 objdump(1) 拆开他们,并得到你想要替换的指令的地址。然后,解析对象文件标题,以了解这些指令的文件中的偏移量,然后更换直接在目标文件与无操作的机器指令。这是有点麻烦,但可行的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top