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内核可以在运行时执行与此类似的操作,但我正在寻找构建时解决方案.
您可以编译代码gcc -S以输出汇编程序列表,而不是完全编译到目标文件或可执行文件中.然后,只需用无操作替换所需的指令(例如使用sed),然后从那里继续编译.
如果您还想为没有原始源代码的目标文件或库执行此操作,则必须使用诸如objdump(1)反汇编它们的工具并获取要替换的指令的地址.然后,解析目标文件头以查找这些指令文件中的偏移量,然后直接在目标文件中用no-ops替换机器指令.这有点棘手,但可行.