"Illegal instruction" 当 运行 ARM 代码针对我的 CPU

"Illegal instruction" when running ARM code targeting my CPU

我正在为 ARM 编译一个相当大的项目。我正在使用 AT91SAM9G25-EK 作为 Debian ARM 映像的开发板 运行。图像中的所有库和可执行文件似乎都是为 armv4t 指令集编译的。

我的CPU是一个ARM926EJ-S,应该运行 armv5tej代码。

我正在使用 GCC 为我的开发板交叉编译。我的 CXX 标志如下所示:

set(CMAKE_CXX_FLAGS "--signed-char --sysroot=${SYSROOT} -mcpu=arm926ej-s -mtune=arm926ej-s -mfloat-abi=softfp" CACHE STRING "" FORCE)

如果我尝试在我的板上运行这个,我在我的依赖项之一(使用 armv4t)初始化期间收到非法指令信号(SIGILL)。

如果我启用拇指模式 (-mthumb -mthumb-interwork) 它可以工作,但对所有代码使用 Thumb,在我的情况下 运行s 慢(我正在做一些重要的数字 c运行清).

在这种情况下,如果我指定一个要为 ARM 模式编译的函数(使用 __attribute__((target("arm")))),它将 运行 正常,直到调用该函数,然后以 SIGILL 退出.

我迷路了。我使用 armv4t 链接库有那么糟糕吗?我误解了 ARM 模式的工作方式吗?它是 linux 内核中的东西吗?

softfp的意思是在函数之间使用soft-float调用约定,但仍然使用它们内部的硬件FPU。假设你的交叉编译器配置了默认的 -mfpu 选项而不是 "none" (运行 arm-whatever-gcc -v 并寻找 --with-fpu= 来检查),那么你已经有问题,因为据我从 Atmel 数据表中可以看出,SAM9G25 没有 FPU。

我的第一直觉是在那儿拍打 GDB,捕捉信号并反汇编有问题的指令以确保,但 Thumb 代码工作正常的事实已经是一个赠品(ARMv6T2 之前的 Thumb 不包含任何协处理器指令,因此不能使用 FPU)。

简而言之,使用 -mfloat-abi=soft 以确保 ARM 代码实际使用软件浮点数并避免使用不存在的 FPU。如果 "serious number crunching" 涉及很多浮点数,也许考虑换一个不同的 MCU...