ARM 交叉编译:使用固定大小数组声明时出现浮点异常

问题描述 投票:0回答:1

为 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 特定的东西?堆栈/堆?

c raspberry-pi arm cross-compiling
1个回答
0
投票

我找到了导致问题的原因:我需要使用工具的 gnueabihf 变体(编译器、链接器等,例如arm-linux-gnueabihf-gcc),我认为“hf”代表“硬浮动”并指的是到树莓派上丢失的 FPU 吗?

我开始使用此存储库中的 docker 映像:https://github.com/tttapa/docker-arm-cross-toolchain,一切正常。感谢您的评论和回复

© www.soinside.com 2019 - 2024. All rights reserved.