gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 13:48:08 26 4
gpt4 key购买 nike

我有一个运行软件的 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 代码,用其他寄存器替换所有“已使用”的寄存器?

最佳答案

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

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

register int *foo asm ("r12");

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

关于使用 gcc 编译 PowerPC 二进制文件并限制可用寄存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34229366/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com