【发布时间】:2021-12-12 18:31:04
【问题描述】:
我一直在尝试为 64 位 powerpc 架构交叉编译 gcc。但是,GCC 配置缺少“powerpc64-elf”目标。它有“powerpc64-linux”、powerpc-rtems(可以产生32/64位代码)。
进一步挖掘,我已经阅读了以下文档(描述了 linux 用于 powerpc64 arch 的 ABI): https://refspecs.linuxfoundation.org/ELF/ppc64/PPC-elf64abi.html
规范引入了一个称为 TOC 的附加部分。此外,本规范使用 ELFv2 格式来解决这些变化。
我的第一个(也许是不相关的问题是)是;
- 使用 TOC 访问全局变量有什么好处?我们必须跳转到 TOC 表,然后使用加载指令,而不是使用单个加载指令。
- 是否有什么东西阻止我们在 powerpc 系统上使用单一负载? 在这一点上,我相当不确定 ELFv2 在 ELF 上的优势(甚至是必要性)。
我的实际问题是,在编译 GCC 时,如果我只是将 ABI 更改为默认的 powerpc ABI,
- 此编译器生成的代码是否仍能生成有效的 64 位代码?
- 我猜即使这样可行,我可能无法使用硬件的某些组件?
提前致谢。
编辑:
澄清: 我忘了提到我不打算在现有的 linux 目标上运行使用修改后的 gcc 编译的程序。相反,我想为操作系统架构支持包简化 ABI(可能使用支持两个平台的相同架构)。
在这种情况下,我想在使用 powerpc-linux(而不是 powerpc64-linux)的 powerpc64 架构上使用 ELFv1 ABI 运行 64 位代码(没有 4GB 内存限制)。
TOC/GOT 开销: 根据比尔关于 GOT 和 TOC 开销的回答,我比较了编译 powerpc32 和 powerpc64 编译器的简单程序的转储。正如他所描述的,GOT 也使用了额外的间接级别。 TOC 似乎引入了 2 条附加指令(加载立即数,然后是添加立即数 - 这是微不足道的)。
【问题讨论】:
标签: gcc cross-compiling elf abi powerpc