将GCC构建为具有多库支持的ARM交叉编译器

时间:2020-07-23 13:53:45

标签: c++ gcc build arm

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

我使用的(相关)标志是

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

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

Binutils构建工作正常,但是在构建gcc的subdir 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支持,因为带有armv4t的{​​{1}}似乎是默认的multilib目标,但没有结果。似乎甚至没有正确的有效multilib目标列表。删除多库列表会生成arm7tdmiarmv4t多库的构建,而我不需要支持。

如何使用armv7-a成功建立两个目标?

1 个答案:

答案 0 :(得分:1)

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

对于软浮动和硬浮动,gcc库和生成的代码均受影响。对于具有armv4和armv5的系统,相同的编译器将始终能够生成相同的代码。此外,生成的对象是相同的ABI。即,它们使用相同的机制传递参数。因此,对象中的汇编指令可能针对armv4或armv5。如果您使用的是armv5体系结构,您甚至可以链接并运行armv4对象。除了代码不是最优的,没有其他问题。

您可以使用armv4和armv5选项两次构建gcc库。保存生成的库。标头将是相同的。生成armv5时,请使用armv5库。使用-mcpu-isystem(如果愿意)和-L获得armv5优化的库。因此,我将使用armv4构建作为 default 。可以肯定的是,可以使用-freestanding gcc-armv5 包装器脚本来完成。


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