NowSec-Blog

在 CentOS 7 x86_64 上交叉编译 ARM64 版本 stress-ng(Linaro 工具链方案)

2026/02/10
27
0

1. 文档背景与适用范围

适用场景

  • 编译机: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 仓库

  • 方案稳定、可复现、企业环境常用


2. 编译环境说明

项目

说明

编译主机

CentOS Linux 7 (Core)

内核

3.10.x

架构

x86_64

GCC(系统)

4.8.5(不使用)

交叉工具链

Linaro GCC 7.5

目标架构

ARM64 / AArch64

目标指令集

armv8-a


3. 准备工作

3.1 安装基础工具

yum install -y git make wget tar

4. 下载并部署 Linaro ARM64 交叉工具链

4.1 下载工具链

cd /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.xz

4.2 解压

tar 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/

4.3 验证 sysroot 是否完整(关键)

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 头文件完整,可以继续。


4.4 设置工具链环境变量

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.sh

5. 获取 stress-ng 源码

cd /root
git clone https://github.com/ColinIanKing/stress-ng.git
cd stress-ng

6. 使用 Linaro 工具链交叉编译 stress-ng

6.1 清理历史编译产物

make clean

6.2 执行交叉编译(推荐参数)

make \
  CC=$TOOLCHAIN/bin/aarch64-linux-gnu-gcc \
  ARCH=arm64 \
  CFLAGS="--sysroot=$TOOLCHAIN/aarch64-linux-gnu/libc -O2 -march=armv8-a"

参数说明

参数

作用

CC

指定 Linaro 的 ARM64 gcc

ARCH=arm64

告诉 stress-ng 目标架构

--sysroot

使用 Linaro 自带 ARM libc

-O2

常规优化

-march=armv8-a

保守指令集,兼容 A53/A55/A72


7. 编译产物说明

7.1 输出文件位置

编译完成后,可执行文件位于:

stress-ng 源码目录下的:
./stress-ng

验证:

ls -lh stress-ng

8. 验证生成的二进制架构

8.1 使用 file 验证(推荐)

file stress-ng

正确输出示例:

ELF 64-bit LSB executable, ARM aarch64, dynamically linked, ...

8.2 使用 readelf 验证(权威)

readelf -h stress-ng | egrep 'Class|Machine'

应输出:

Class:                             ELF64
Machine:                           AArch64

9. 在 x86 主机上运行验证(可选)

9.1 安装 QEMU

yum install -y qemu-user

9.2 运行验证

qemu-aarch64 ./stress-ng --version

能正常输出版本号,说明:

  • 架构正确

  • ELF 可执行

  • libc 解析正常


10. 常见问题排查

Q1:fatal error: errno.h: No such file or directory

原因:未使用 sysroot 或 sysroot 不完整
解决:确认 --sysroot=$TOOLCHAIN/aarch64-linux-gnu/libc 参数存在


Q2:ARM 机器运行时报 Illegal instruction

原因:编译时启用了目标 CPU 不支持的指令
解决:使用 -march=armv8-a(已在本方案中规避)


Q3:误编译成 x86_64

原因:使用了系统 gcc
解决:确认 CC 指向 $TOOLCHAIN/bin/aarch64-linux-gnu-gcc


11. 最终推荐命令(可直接复制)

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"

12. 结论

  • CentOS 7 x86_64 官方仓库不支持 ARM glibc 交叉开发

  • Linaro 工具链是最稳妥、可复现的解决方案