试图禁止指令

时间:2009-04-25 00:02:12

标签: gcc compiler-construction linker assembly binutils

是否可以使用GNU工具(gcc,binutils等)将所有出现的汇编指令修改为无操作?具体来说,带-pg选项的gcc会生成以下程序集(ARM):

   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内核可以在运行时执行与此类似的操作,但我正在寻找构建时解决方案。

2 个答案:

答案 0 :(得分:6)

您可以使用gcc -S编译代码以输出汇编程序列表,而不是完全编译到目标文件或可执行文件中。然后,只需用无操作替换所需的指令(例如使用sed),然后从那里继续编译。

如果您还想为没有原始源代码的目标文件或库执行此操作,则必须使用objdump(1)之类的工具来反汇编它们并获取地址您希望更换的说明。然后,解析目标文件头以查找这些指令文件中的偏移量,然后直接在目标文件中用no-ops替换机器指令。这有点棘手,但可行。

答案 1 :(得分:4)

使用RISC-ish固定长度指令格式肯定比使用RISC-ish固定长度指令格式更容易。 86。

使用libelf(这里很好的教程:http://people.freebsd.org/~jkoshy/download/libelf/article.html)或libbfd(http://sourceware.org/binutils/docs-2.19/bfd/index.html)来打开目标文件,修改.text部分中的指令并再次写出来应该相对简单使用提供的API。是否值得努力将取决于非技术方面的考虑(虽然我有点好奇......)。

值得一提的是,如果需要在交叉开发环境中工作,使用libelf或libbfd可能会有一些问题。