为 Raspberry Pi 交叉编译 C 程序时,生成的可执行文件在 Pi 上执行时会失败并显示
Floating Point Exception
。我可以将范围缩小到这个重现问题的最小 C 程序:
int main() {
char x[1];
return 0;
}
大小 (1) 也没关系,1024 或任何大小的数组都有同样的问题。
如果我
,则不会发生错误char x[1]
线x = malloc(1)
交叉编译是用这个docker镜像完成的:
FROM ubuntu:24.04
ENV BUILD_DIR="/build"
ENV CPATH="/usr/local/include"
WORKDIR /root
RUN apt-get update && \
apt-get install -y \
cmake \
git \
build-essential \
gcc-arm-linux-gnueabihf \
gcc-arm-linux-gnueabi \
g++-arm-linux-gnueabihf \
g++-arm-linux-gnueabi
RUN git clone https://github.com/hannenz/pigpio && \
cd pigpio && \
make CROSS_PREFIX=arm-linux-gnueabi- && \
make install
WORKDIR ${BUILD_DIR}
docker run -it \
-v /home/hannenz/pidev/projects/pi/kiddyblaster:/build \
-w /build \
-e BUILD_DIR=/build/build \
-e SRC_DIRS=/build/src \
pidev \
arm-linux-gnueabi-gcc -o test test.c
scp test raspberry-pi:/home/pi/
并在树莓派上执行:
pi@kiddyblaster:~ $ ./test
Floating point exception
pi@kiddyblaster:~ $ echo $?
136
Raspberry Pi 是 Pi 2 Model B Rev 1.1,带有全新安装的 PiOS Lite (Raspian 12):
pi@kiddyblaster:~ $ cat /proc/cpuinfo | tail -n 14
processor : 3
model name : ARMv7 Processor rev 5 (v7l)
BogoMIPS : 38.40
Features : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x0
CPU part : 0xc07
CPU revision : 5
Hardware : BCM2835
Revision : a01041
Serial : 000000006a731e3b
Model : Raspberry Pi 2 Model B Rev 1.1
pi@kiddyblaster:~ $ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description: Raspbian GNU/Linux 12 (bookworm)
Release: 12
Codename: bookworm
如果有任何关于我可以开始调试这个的提示,我会很高兴。与交叉编译工具链有关吗?内存管理?小/大端? ARM 特定的东西?堆栈/堆?
我找到了导致问题的原因:我需要使用工具的 gnueabihf 变体(编译器、链接器等,例如arm-linux-gnueabihf-gcc),我认为“hf”代表“硬浮动”并指的是到树莓派上丢失的 FPU 吗?
我开始使用此存储库中的 docker 映像:https://github.com/tttapa/docker-arm-cross-toolchain,一切正常。感谢您的评论和回复