【问题标题】:powerpc-elf abi instead of elfv2 on 64 bit powerpc systems, is it possible?64位powerpc系统上的powerpc-elf abi而不是elfv2,有可能吗?
【发布时间】: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


    【解决方案1】:

    简短回答:不,您不能使用 powerpc-linux 作为 64 位 PowerPC 目标的目标。

    您需要针对要运行您的代码的 Linux 发行版的目标进行交叉编译。对于大多数现代发行版,代码将以 little-endian 模式运行,因此您需要以 powerpc64le-linux 为目标。一些较旧的发行版以大端模式运行,目标为 powerpc64-linux。一般来说,powerpc64-linux 使用 ELF v1 ABI,而 powerpc64le-linux 使用 ELF v2 ABI。两者都使用 TOC 指针。

    PowerPC 在使用编译器管理的目录 (TOC) 和链接器管理的全局偏移表 (GOT) 方面有点独特,这与许多目标使用的单个 GOT 不同。但实际上,由于各种编译器和链接器优化,开销并没有那么不同。在这两个系统中,访问全局共享变量时都需要额外的间接级别,因为这些变量的地址直到运行时才知道,并且由动态链接器满足(使用纯静态链接时除外,这在今天并不常见)。

    简而言之,不要担心 TOC,并为您的代码预期运行的环境设置交叉编译。

    【讨论】:

    • 您好比尔,感谢您的回答。我忘了提到我不打算在现有的 linux 目标上运行使用修改后的 gcc 编译的程序。相反,我想为 OS 架构支持包简化 ABI(可能使用支持两个平台的相同架构)。在这种情况下,我想在使用 powerpc-linux(而不是 powerpc64-linux)的 powerpc64 架构上使用 ELFv1 ABI 运行 64 位代码(没有 4GB 内存限制)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多