【问题标题】:Building GCC as an ARM cross compiler with multilib support将 GCC 构建为具有多库支持的 ARM 交叉编译器
【发布时间】:2020-07-23 13:53:45
【问题描述】:

我想从源代码构建 GCC 作为 ARM 裸机目标的交叉编译器。具体来说,我需要对架构 armv4tarmv5te 以及 softfp 的支持,因为它们缺乏适当的 FPU。

我使用的(相关)标志是

--with-cpu=arm946e-s --with-mode=arm --with-float=soft --enable-interwork --enable-multilib --with-multilib-list=armv4t,armv5te

通过这种方式,我试图通过--with-cpu 选项实现编译器默认为armv5te,并且仍然保持为armv4t 构建的机会。

Binutils 构建工作正常,但是在构建 gcc 的子目录 gcc 时,multilib 检查失败:

For arm946e-s real value is arm946e-s
Error: --with-multilib-list=armv4t,armv5te not supported.
make: *** [Makefile:4356: configure-gcc] Error 1

我查看了如何启用armv5te 支持,因为armv4tarm7tdmi 似乎是默认的multilib 目标,但没有找到任何结果。似乎甚至没有有效的 multilib 目标的正确列表。删除多库列表生成了 armv4tarmv7-a 多库的构建,我不需要支持。

如何使用softfp 成功构建两个目标?

【问题讨论】:

  • gcc.gnu.org/install/configure.html --with-multilib-list= 只需要rmprofile 或/和aprofile,没有别的
  • armv5te 不是皮质系列架构,所以这两个配置文件都不能解决问题

标签: c++ gcc build arm


【解决方案1】:

TL-DR;没有必要。使用包装器并链接到所需的标准库。

对于软浮点和硬浮点,gcc 库和生成的代码都会受到影响。对于具有 armv4 和 armv5 的系统,相同的编译器将始终能够生成相同的代码。此外,生成的对象是相同的 ABI。即,它们使用相同的机制传递参数。因此,对象内的汇编指令可能以 armv4 或 armv5 为目标。如果您使用的是 armv5 架构,您甚至可以链接并运行 armv4 对象。除了代码次优之外没有任何问题。

您可以使用 armv4 和 armv5 选项构建 gcc 库两次。保存生成的库。标题将是相同的。构建 armv5 时,请使用 armv5 库。使用-mcpu-isystem(如果你喜欢)和-L 来获取armv5 优化库。出于这个原因,我会使用 armv4 构建作为 默认。当然,这可以通过 -freestandinggcc-armv5 包装脚本来完成。


multilib 配置的特殊之处在于,实际的编译器二进制文件可以生成两组序言和尾声。甚至在 multilib 之前,总是可以使用带有-mcpu-march-mtune 的相同编译器生成armv4 或armv5 代码。只是他们有相同的序幕和尾声。 gcc 中的指令生成后端一直是multicpu。可能 multilib 最好命名为 multiabi

【讨论】:

    猜你喜欢
    • 2014-09-30
    • 1970-01-01
    • 1970-01-01
    • 2016-02-05
    • 1970-01-01
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    • 2019-06-19
    相关资源
    最近更新 更多