我需要为嵌入式设备交叉编译 C++ 代码,其规格如下所示,并支持硬件浮点操作。在没有硬件浮动支持的情况下从 Ubuntu 20.04 进行交叉编译很容易,我可以运行arm-linux-gnueabi-g++ -marm -mcpu=arm926ej-s -mfloat-abi=soft -mfpu=vfp
并且它会工作。与我一起跑步时-mfloat-abi=hard
得到:
/usr/lib/gcc-cross/arm-linux-gnueabi/9/../../../../arm-linux-gnueabi/bin/ld: error: ArmSimulateStartStop uses VFP register arguments, /usr/lib/gcc-cross/arm-linux-gnueabi/9/crtbegin.o does not
/usr/lib/gcc-cross/arm-linux-gnueabi/9/../../../../arm-linux-gnueabi/bin/ld: failed to merge target specific data of file /usr/lib/gcc-cross/arm-linux-gnueabi/9/crtbegin.o
/usr/lib/gcc-cross/arm-linux-gnueabi/9/../../../../arm-linux-gnueabi/bin/ld: error: ArmSimulateStartStop uses VFP register arguments, /usr/lib/gcc-cross/arm-linux-gnueabi/9/crtend.o does not
/usr/lib/gcc-cross/arm-linux-gnueabi/9/../../../../arm-linux-gnueabi/bin/ld: failed to merge target specific data of file /usr/lib/gcc-cross/arm-linux-gnueabi/9/crtend.o
collect2: error: ld returned 1 exit status
make: *** [Makefile:12: CrossCompile] Error 1
我知道这个处理器支持硬件浮动支持,它在手臂文档。我下载了构建根目录和交叉工具但我不知道如何为我的设备硬件配置它们。如何使用 VFP 支持进行交叉编译?
设备规格:
~ $ cat /proc/cpuinfo
Processor : ARM926EJ-S rev 5 (v5l)
BogoMIPS : 197.83
Features : swp half thumb fastmult edsp java
CPU implementer : 0x41
CPU architecture: 5TEJ
CPU variant : 0x0
CPU part : 0x926
CPU revision : 5
~ $ cat /proc/version
Linux version 2.6.36 (owzafs@PCOWZAFS) (gcc version 4.4.1 (Sourcery G++ Lite 2010q1-202) ) #464 PREEMPT Thu Apr 19 13:50:56 CEST 2018
编辑: 根据海湾合作委员会文件:不支持将 -mfloat-abi=hard 与 VFP 协处理器一起使用。将 -mfloat-abi=softfp 与适当的 -mfpu 选项结合使用,以允许编译器生成利用这些 CPU 的硬件浮点功能的代码。
我使用了mfloat-abi=softfp
代码并进行了编译,但是,当在设备上运行二进制文件时,我得到了Illegal instruction
(没有其他任何东西)。
答案1
看起来像对象crtbegin.o
并且crtend.o
与主线构建不匹配。
我觉得最好的方法是重新编译crtbegin.s
,crtend.s
需要使用相同的设置重新编译-mfloat-abi=hard
,创建单独的crtbegin.o
并重crtend.o
试。