交叉编译 - 错误:在ARM模式下选择的处理器不支持 `fmrx r3,fpexc' - Beaglebone

8

我正在尝试将一个文件交叉编译到Beaglebone Black的闪存中。 一切工作正常,但是如果我尝试启用浮点单元(FPU)使用以下命令:

#define set_en_bit_in_fpexc() do { \
    int dummy; \
    __asm__ __volatile__ ("fmrx %0,fpexc\n\t" \
                         "orr  %0,%0,#0x40000000\n\t" \
                         "fmxr fpexc,%0" : "=r" (dummy) : :); \
} while (0)

我得到了以下错误:
Error: selected processor does not support `fmrx r3,fpexc' in ARM mode
Error: selected processor does not support `fmxr fpexc,r3' in ARM mode

我也尝试了缩略模式,但是我收到了相同的错误。 当然,如果我删除初始化FPU的代码部分,它就可以正常工作。
为什么会出现这些错误? Makefile
[...]
CROSSPATH?=/usr/bin
CROSSPFX=$(CROSSPATH)/arm-none-eabi-
CC=$(CROSSPFX)gcc
AS=$(CROSSPFX)as
LD=$(CROSSPFX)ld
NM=$(CROSSPFX)nm
OBJCOPY=$(CROSSPFX)objcopy
OBJDUMP=$(CROSSPFX)objdump
CFLAGS=-Wall -Wextra -O2 -ffreestanding
ARCHFLAGS=-mcpu=cortex-a8 -march=armv7-a -mfpu=neon
CCARCHFLAGS=$(ARCHFLAGS) -marm
[...]

我使用的是 Arch Linux,内核版本为 4.8.1。

P.S. 我的教授使用 Linaro 交叉编译器,它可以正常工作。

2个回答

4
大多数Linaro工具链默认配置为ARMv7硬浮点(肯定是Linux版本,我对裸机版本不太确定)。查看Arch打包的arm-none-eabi工具链的配置,我猜测它只是使用了GCC的默认设置,这意味着类似于ARMv4t,而且重要的是软浮点ABI。
尽管-mfpu选项控制代码生成的浮点指令使用情况,但显然是浮点ABI控制它是否允许您执行真正只在硬件FPU上才有意义的操作,而不是在浮点模拟下执行。
当它没有默认配置时,您需要明确选择一个浮点ABI,暗示实际硬件FPU,即-mfloat-abi=hard(或-mfloat-abi=softfp,但除非您需要链接其他软浮点代码,否则没有理由使用该选项)。

1

-mfpu=vfpv3-d16 -mfloat-abi=hard

为了提供更直接的解决方案,我不得不添加-mfpu=vfpv3-d16

测试代码 a.S:

fmrx r2, fpscr

工作命令:

sudo apt-get install binutils-arm-linux-gnueabihf
arm-linux-gnueabihf-as -mfpu=vfpv3-d16 -mfloat-abi=hard a.S

请注意,在此特定版本的arm-linux-gnueabihf-as构建中,默认启用了-mfloat-abi=hard,可以省略。 float-abi的默认值可能取决于在GCC构建时使用-msoft-float还是-mhard-float进行控制:
./configure --with-float=soft

如文档所述:https://gcc.gnu.org/install/configure.html。您可以使用 gcc -v 获取用于工具链构建的标志,如 What configure options were used when building gcc / libstdc++? 所述。但是,如果没有给出默认值,则不容易确定其默认值。

您可能还感兴趣的是 -mfloat-abi=softfp,它可以为可执行文件生成硬浮点,但生成软件函数调用:ARM compilation error, VFP registered used by executable, not object file

-mfpu= 的可能值可以在此处找到:https://gcc.gnu.org/onlinedocs/gcc-7.2.0/gcc/ARM-Options.html#ARM-Options

需要注意的是,FMRX是VMRS的旧版语法,而VMRS是较新的推荐语法,详情请参见:ARM指令SWI和SVC是否完全相同?

在Ubuntu 16.04上测试通过,使用arm-linux-gnueabihf-as 2.26.1。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接