2. 交叉编译工具链配置

任务目标

在x86开发主机上安装ARM交叉编译工具链,编写Hello World程序并编译为ARM可执行文件,最终将其传输至目标板(ARM架构)运行验证。

环境准备

开发主机:Ubuntu 20.04/22.04 x86_64。目标板:ARMv7 Cortex-A系列(如i.MX6ULL),运行Linux系统,IP地址假设为192.168.1.100,用户名root。开发主机与目标板需能通过网络互通。

安装交叉编译工具链

使用apt直接安装Linaro维护的ARM交叉编译工具链:

sudo apt update
sudo apt install -y gcc-arm-linux-gnueabihf
# 验证安装
arm-linux-gnueabihf-gcc --version

安装完成后,arm-linux-gnueabihf-gcc即作为交叉编译器使用。若目标板为ARMv8 64位架构,则安装gcc-aarch64-linux-gnu,下文以ARMv7为例。

编写Hello World

创建源文件hello.c:

#include <stdio.h>

int main(void) {
    printf("Hello from ARM board!\n");
    return 0;
}

交叉编译

arm-linux-gnueabihf-gcc -o hello hello.c
# 确认生成的是ARM可执行文件
file hello

file命令输出应包含ARM和EABI5字样,说明已生成ARM架构的可执行文件。若输出为x86-64,说明仍调用了本机gcc,请检查编译器名称。

传输并运行

# 在开发主机上执行
scp hello root@192.168.1.100:/root/
ssh root@192.168.1.100 "./hello"

若目标板未配置SSH服务,可使用adb push或U盘拷贝等方式替代scp。

验证判定标准

在目标板终端看到输出Hello from ARM board!即判定通过。若出现cannot execute binary file: Exec format error,说明可执行文件架构与目标板不匹配,需检查工具链选择是否正确。

常见问题

  • 编译时头文件缺失:确认已安装gcc-arm-linux-gnueabihf而非仅安装binutils-arm-linux-gnueabihf。
  • 目标板无法执行:在开发主机执行readelf -h hello查看Machine字段,应为ARM。若目标板是ARMv8且运行64位内核,需改用aarch64-linux-gnu-gcc重新编译。
  • 动态链接问题:若目标板文件系统精简,可能缺少动态链接库。可改用静态编译:arm-linux-gnueabihf-gcc -static -o hello hello.c。
交叉编译流程 开发主机 (x86_64) hello.c (C源码) arm-linux-gnueabihf-gcc 交叉编译器 hello (ARM) scp 传输 目标板 (ARM Cortex-A) hello (ARM) ./hello 执行 Hello from ARM board! 终端输出 ARMv7 + Linux