使用 gcc 编译 PowerPC 二进制文件并限制可用寄存器

Compiling PowerPC binary with gcc and restrict useable registers

我有一个 PowerPC 设备 运行 一个软件,我想通过插入一些自己的代码部分来修改这个软件。

我可以轻松编写自己的汇编代码,将其放在 RAM 中未使用区域的某个位置,将 "official" 代码中的任何指令替换为 b 0x80001234,其中 0x80001234 是我自己的 RAM 地址代码扩展被加载。

然而,当我用 powerpc-eabi-gcc 编译 C 代码时,gcc 假定它编译了一个完整的程序,而不仅仅是 "code parts" 被插入到 运行 程序中。

这就导致了一个问题:主程序使用了一些CPU的寄存器来存储数据,当我把我的扩展复制进去的时候,它会把之前的内容弄乱。

例如,如果我要插入代码的主程序在该代码块中使用寄存器5和寄存器8,如果我自己的代码写入r5或r8,程序将崩溃。然后我需要将编译后的二进制文件转换回汇编代码,编辑适当的寄存器以使用 r5 和 r8 以外的寄存器,然后再次编译该 ASM 源代码。

我现在搜索的是 ppc-gcc 的一个选项,它告诉它 "never ever use the PPC registers r5 and r8 while creating the bytecode"。

这可能吗,还是我需要继续自己爬取 ASM 代码,用其他寄存器替换所有 "used" 寄存器?

你应该考虑另一种方法来解决这个问题。

reserve a register as a global variable 有一个 gcc 扩展:

register int *foo asm ("r12");

请注意,如果您使用此扩展程序,您的程序将不再确认您正在使用的操作系统的 ABI。这意味着您不能在不冒程序崩溃、变量被覆盖或崩溃的风险的情况下调用任何库函数。