在使用硬浮点时,使用gcc交叉编译普通示例时出现问题

在使用硬浮点时,使用gcc交叉编译普通示例时出现问题,gcc,arm,cross-compiling,cortex-m,Gcc,Arm,Cross Compiling,Cortex M,当我试图编译一个简单的例子test.c int main(){ 返回0; } 对于具有硬浮动ABI的cortex m7目标,使用以下调用 arm-none-eabi-gcc -mcpu=cortex-m7 -mfpu=fpv5-d16 -mfloat-abi=hard --specs=nosys.specs test.c 我得到这个错误: /usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/bin/ld: error: /usr/l

当我试图编译一个简单的例子
test.c

int main(){
返回0;
}
对于具有硬浮动ABI的cortex m7目标,使用以下调用

arm-none-eabi-gcc -mcpu=cortex-m7 -mfpu=fpv5-d16 -mfloat-abi=hard --specs=nosys.specs test.c
我得到这个错误:

/usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/bin/ld: error: /usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/lib/crt0.o: Conflicting CPU architectures 13/1
/usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/bin/ld: failed to merge target specific data of file /usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/lib/crt0.o
/usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/bin/ld: error: a.out uses VFP register arguments, /usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/lib/libc.a(lib_a-atexit.o) does not
[snip]
/usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/bin/ld: failed to merge target specific data of file /usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/lib/libnosys.a(_exit.o)
collect2: error: ld returned 1 exit status
所以问题是gcc链接到错误的
libc.a
。如果我使用参数
print multi directory
,我的
arm none-eabi-gcc
版本似乎应该支持此体系结构:

$ arm-none-eabi-gcc -mcpu=cortex-m7 -mfpu=fpv5-d16 -mfloat-abi=hard --specs=nosys.specs --print-multi-directory
thumb/v7e-m/fpv5/hard
我可以列出
arm-none-eabi-gcc
提供的
libc.a
的不同版本:

$ find /usr/lib/arm-none-eabi/ -name libc.a
/usr/lib/arm-none-eabi/newlib/armv7e-m/libc.a
/usr/lib/arm-none-eabi/newlib/armv7e-m/fpu/fpv5-sp-d16/libc.a
/usr/lib/arm-none-eabi/newlib/armv7e-m/fpu/libc.a
/usr/lib/arm-none-eabi/newlib/armv7e-m/fpu/fpv5-d16/libc.a
/usr/lib/arm-none-eabi/newlib/armv7e-m/softfp/fpv5-sp-d16/libc.a
/usr/lib/arm-none-eabi/newlib/armv7e-m/softfp/libc.a
/usr/lib/arm-none-eabi/newlib/armv7e-m/softfp/fpv5-d16/libc.a
/usr/lib/arm-none-eabi/newlib/libc.a
/usr/lib/arm-none-eabi/newlib/armv6-m/libc.a
/usr/lib/arm-none-eabi/newlib/fpu/libc.a
/usr/lib/arm-none-eabi/newlib/thumb/libc.a
/usr/lib/arm-none-eabi/newlib/armv7-m/libc.a
所以看起来有一个版本的
libc.a
是为我想要的架构编译的,但是gcc并没有针对它进行链接。如何让gcc链接到正确版本的
libc.a


我使用的是Ubuntu 18.04的
gcc arm none eabi
包提供的arm none eabi gcc版本6.3.1。

nosys的可能副本配置了软浮点abi。您需要为目标cpu使用硬浮点abi重新编译newlib。或者在没有
-specs=nosys.specs的情况下重新编译
-specs=nosys.specs
这个问题在没有
-specs=nosys.specs
.hm的情况下仍然存在。这一点很好,但他链接到了不同的文件
/usr/lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/libc.a
。只是编译。。。也许可以沿着
-nostlib
尝试一些东西,然后沿着命令行传递适当的libc.a?看起来像是我发现的一个相关的gcc错误,请参阅不要使用
-mcpu=cortex-m7
,使用
-march=armv7e-m
来选择正确的库。这与另一个问题类似,但我认为这不是重复的问题。我想随着时间的推移,多库匹配已经有所改进,可以解释godbolt的成功。