试图禁止指令

ctu*_*fli 1 compiler-construction assembly linker gcc 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>
Run Code Online (Sandbox Code Playgroud)

我想记录最后一条指令的地址,然后将其更改为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)
Run Code Online (Sandbox Code Playgroud)

Linux内核可以在运行时执行与此类似的操作,但我正在寻找构建时解决方案.

Ada*_*eld 6

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

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