1

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

4

2 回答 2

6

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

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

于 2009-04-25T01:18:54.840 回答
4

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

使用 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 可能会有一些问题。

于 2009-04-25T00:49:18.813 回答