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