如何使用单个GCC(交叉)编译器(交叉)编译到ARM硬件和软件浮点(softfp)?

时间:2014-03-21 14:45:24

标签: gcc arm calling-convention

我想使用单个(交叉)编译器来编译不同ARM调用约定的代码:因为我总是想使用浮点和NEON指令,所以我只想选择硬浮点调用约定或soft-float(softfp)调用约定。

我的编译器默认为hard-float,但它支持我需要的两种架构:

$ arm-linux-gnueabihf-gcc -print-multi-lib
.;
arm-linux-gnueabi;@marm@march=armv4t@mfloat-abi=soft
$

当我使用默认参数编译时:

$ arm-linux-gnueabihf-g++ -Wall -o hello_world_armhf hello_world.cpp

成功没有任何错误。

如果我使用-print-multi-lib返回的参数进行编译:

$ arm-linux-gnueabihf-g++ -marm -march=armv4t -mfloat-abi=soft -Wall -o hello_world hello_world.cpp

它再次编译没有错误(顺便说一句,我如何测试结果代码是硬浮动还是软浮动?)

不幸的是,如果我试试这个:

$ arm-linux-gnueabihf-g++ -march=armv7-a -mthumb-interwork -mfloat-abi=softfp -mfpu=neon -Wall -o hello_world hello_world.cpp
[...]/gcc/bin/../lib/gcc/arm-linux-gnueabihf/4.7.3/../../../../arm-linux-gnueabihf/bin/ld: error: hello_world uses VFP register arguments, /tmp/ccwvfDJo.o does not
[...]/gcc/bin/../lib/gcc/arm-linux-gnueabihf/4.7.3/../../../../arm-linux-gnueabihf/bin/ld: failed to merge target specific data of file /tmp/ccwvfDJo.o
collect2: error: ld returned 1 exit status
$

我测试了一些参数的其他排列,但似乎除-print-multi-lib所示的组合之外的任何其他内容都会导致错误。

我读过ARM compilation error, VFP registered used by executable, not object file但问题是二进制文件的某些部分是软的 - 有些是硬浮动的。我有一个C ++文件要编译......

我错过了能够用-march = armv7 -a -mthumb-interwork -mfloat-abi = softfp -mfpu = neon编译的参数?

当我在命令行中明确地使用-mfloat-abi = softfp来禁止VFP寄存器参数时,该错误是如何可能与VFP寄存器参数有关的?

谢谢!

对于记录,hello_world.cpp包含以下内容:

#include <iostream>

int main()
{
  std::cout << "Hello, world!" << std::endl;
  return 0;
}

2 个答案:

答案 0 :(得分:1)

您需要另一个具有相应multilib支持的编译器。 您可以使用下一个命令检查multilib支持。

arm-none-eabi-gcc -print-multi-lib
.;
thumb;@mthumb
fpu;@mfloat-abi=hard
armv6-m;@mthumb@march=armv6s-m
armv7-m;@mthumb@march=armv7-m
armv7e-m;@mthumb@march=armv7e-m
armv7-ar/thumb;@mthumb@march=armv7
cortex-m7;@mthumb@mcpu=cortex-m7
armv7e-m/softfp;@mthumb@march=armv7e-m@mfloat-abi=softfp@mfpu=fpv4-sp-d16
armv7e-m/fpu;@mthumb@march=armv7e-m@mfloat-abi=hard@mfpu=fpv4-sp-d16
armv7-ar/thumb/softfp;@mthumb@march=armv7@mfloat-abi=softfp@mfpu=vfpv3-d16
armv7-ar/thumb/fpu;@mthumb@march=armv7@mfloat-abi=hard@mfpu=vfpv3-d16
cortex-m7/softfp/fpv5-sp-d16;@mthumb@mcpu=cortex-m7@mfloat-abi=softfp@mfpu=fpv5-sp-d16
cortex-m7/softfp/fpv5-d16;@mthumb@mcpu=cortex-m7@mfloat-abi=softfp@mfpu=fpv5-d16
cortex-m7/fpu/fpv5-sp-d16;@mthumb@mcpu=cortex-m7@mfloat-abi=hard@mfpu=fpv5-sp-d16
cortex-m7/fpu/fpv5-d16;@mthumb@mcpu=cortex-m7@mfloat-abi=hard@mfpu=fpv5-d16
https://stackoverflow.com/questions/37418986/how-to-interpret-the-output-of-gcc-print-multi-lib

How to interpret the output of gcc -print-multi-lib 使用此配置gcc -mfloat-abi=hard不仅可以在不使用FPU指令的情况下构建文件,还可以将它们与相应的库链接起来,从而避免"X uses VFP register arguments, Y does not"错误。

gcc使用this patch-print-multi-lib配置选项生成的上述--with-multilib-list=armv6-m,armv7,armv7-m,armv7e-m,armv7-r,armv7-a,cortex-m7输出。 如果您有兴趣使用Cortex-A系列multilib支持构建自己的gcc,只需对任何--with-multilib-list=aprofile目标使用arm*-*-*配置选项,而无需任何补丁(at list with gcc-6.2.0)。

答案 1 :(得分:0)

根据Linaro FAQ,如果您的编译器打印arm-linux-gnueabi;@marm@march=armv4t@mfloat-abi=soft,那么您只能使用-march=armv4t。如果你想使用-march=armv7-a,你需要自己构建编译器。

以下链接可能有助于您自己构建GCC ARM Builds