编译机:CentOS Linux 7 x86_64
系统库:glibc 2.17
目标架构:ARM64(aarch64)
目标系统:通用 Linux(glibc),非 OpenWrt / musl
需求:在 无法通过 yum 获取 aarch64 glibc-devel 的情况下完成交叉编译
CentOS 7 官方仓库 不支持 x86_64 → aarch64 的 glibc 交叉开发包
使用 Linaro 官方交叉工具链,自带完整 sysroot
不污染系统环境、无需依赖 AltArch 仓库
方案稳定、可复现、企业环境常用
yum install -y git make wget tarcd /opt
wget https://releases.linaro.org/components/toolchain/binaries/7.5-2019.12/aarch64-linux-gnu/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xztar xf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz解压后目录结构示例:
/opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/
├── bin/
├── lib/
├── libexec/
└── aarch64-linux-gnu/
└── libc/
├── lib/
└── usr/
└── include/ls /opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/libc/usr/include/errno.h能看到 errno.h 说明 ARM libc 头文件完整,可以继续。
export TOOLCHAIN=/opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu(可选)写入 /etc/profile.d/linaro.sh 供长期使用:
echo 'export TOOLCHAIN=/opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu' > /etc/profile.d/linaro.shcd /root
git clone https://github.com/ColinIanKing/stress-ng.git
cd stress-ngmake cleanmake \
CC=$TOOLCHAIN/bin/aarch64-linux-gnu-gcc \
ARCH=arm64 \
CFLAGS="--sysroot=$TOOLCHAIN/aarch64-linux-gnu/libc -O2 -march=armv8-a"编译完成后,可执行文件位于:
stress-ng 源码目录下的:
./stress-ng验证:
ls -lh stress-ngfile 验证(推荐)file stress-ng正确输出示例:
ELF 64-bit LSB executable, ARM aarch64, dynamically linked, ...readelf 验证(权威)readelf -h stress-ng | egrep 'Class|Machine'应输出:
Class: ELF64
Machine: AArch64yum install -y qemu-userqemu-aarch64 ./stress-ng --version能正常输出版本号,说明:
架构正确
ELF 可执行
libc 解析正常
fatal error: errno.h: No such file or directory原因:未使用 sysroot 或 sysroot 不完整
解决:确认 --sysroot=$TOOLCHAIN/aarch64-linux-gnu/libc 参数存在
Illegal instruction原因:编译时启用了目标 CPU 不支持的指令
解决:使用 -march=armv8-a(已在本方案中规避)
原因:使用了系统 gcc
解决:确认 CC 指向 $TOOLCHAIN/bin/aarch64-linux-gnu-gcc
export TOOLCHAIN=/opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu
make clean
make \
CC=$TOOLCHAIN/bin/aarch64-linux-gnu-gcc \
ARCH=arm64 \
CFLAGS="--sysroot=$TOOLCHAIN/aarch64-linux-gnu/libc -O2 -march=armv8-a"CentOS 7 x86_64 官方仓库不支持 ARM glibc 交叉开发
Linaro 工具链是最稳妥、可复现的解决方案