我有运行软件的PowerPC设备,我想通过插入一些自己的代码部分来修改此软件。
我可以轻松编写自己的汇编代码,将其放在RAM中未使用的区域中,替换"官方"中的任何指令。代码b 0x80001234
,其中0x80001234是加载我自己的代码扩展的RAM地址。
然而,当我使用powerpc-eabi-gcc
编译C代码时,gcc假设它编译了一个完整的程序而不仅仅是编码部分"插入正在运行的程序。
这会导致一个问题:主程序使用一些CPU寄存器来存储数据,当我只是将我的扩展名复制到其中时,它会混乱以前的内容。
例如,如果我要插入代码的主程序使用寄存器5和该代码块中的寄存器8,如果我自己的代码写入r5或r8,程序将崩溃。然后我需要将编译后的二进制文件转换回汇编代码,编辑相应的寄存器以使用除r5和r8之外的寄存器,然后再次编译该ASM源。
我现在正在寻找的是ppc-gcc的一个选项,它告诉它"在创建字节码"时永远不要使用PPC寄存器r5和r8。
这是可能的还是我需要继续自己爬行ASM代码来替换所有"使用过的"向其他寄存器注册?
答案 0 :(得分:3)
您应该考虑另一种解决此问题的方法。
reserve a register as a global variable有一个gcc扩展名:
register int *foo asm ("r12");
请注意,如果您使用此扩展程序,您的程序将不再向您正在使用的操作系统的ABI确认。这意味着您无法调用任何库函数,而不会有程序崩溃,覆盖变量或崩溃的风险。