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。