4. 交叉编译工具链配置:ARM64 交叉编译工具链

在 TrustZone 与 OP-TEE 开发中,目标平台通常是 ARM64 架构的嵌入式设备(如 Raspberry Pi 3/4、QEMU virt 或 i.MX 系列)。开发主机(x86_64)无法直接运行 ARM 二进制文件,因此必须安装 交叉编译工具链,使主机能够生成目标平台可执行的代码。

核心概念:交叉编译工具链由 binutils(汇编器、链接器)、gcc(编译器)、glibc(C 库)及 linux kernel headers 组成。前缀 aarch64-linux-gnu- 表示目标架构为 64 位 ARM,运行 Linux 系统,使用 GNU C 库。

4.1 工具链下载与安装

推荐使用 Linaro 或 ARM 官方维护的预编译工具链,避免从源码构建的复杂性。以下是两种主流获取方式:

方式 来源 版本示例 适用场景
APT 包管理器 Ubuntu/Debian 官方源 gcc-aarch64-linux-gnu (v9/v10) 快速搭建、原型验证
Linaro 预编译包 releases.linaro.org gcc-arm-9.2-2019.12-x86_64-aarch64-linux-gnu 版本可控、CI/CD 集成
ARM 官方工具链 developer.arm.com arm-gnu-toolchain-13.2 最新特性、商业支持

4.1.1 使用 APT 安装(推荐快速开始)

# 更新包索引
sudo apt update

# 安装 ARM64 交叉编译工具链及依赖
sudo apt install -y \
    gcc-aarch64-linux-gnu \
    g++-aarch64-linux-gnu \
    binutils-aarch64-linux-gnu \
    libc6-dev-arm64-cross \
    pkg-config-aarch64-linux-gnu

# 验证安装
aarch64-linux-gnu-gcc --version

4.1.2 使用 Linaro 预编译包安装(推荐生产环境)

# 下载 Linaro GCC 9.2 工具链(约 200MB)
wget https://releases.linaro.org/components/toolchain/binaries/latest-9/aarch64-linux-gnu/gcc-linaro-9.2.1-2019.12-x86_64_aarch64-linux-gnu.tar.xz

# 解压到 /opt 目录
sudo tar -xvf gcc-linaro-9.2.1-2019.12-x86_64_aarch64-linux-gnu.tar.xz -C /opt/

# 重命名(可选)
sudo mv /opt/gcc-linaro-9.2.1-2019.12-x86_64_aarch64-linux-gnu /opt/aarch64-toolchain
路径建议:将工具链统一放置在 /opt/ 或 /usr/local/ 下,避免与系统包管理器冲突。不建议放在用户家目录,因为多用户协作时权限管理不便。

4.2 环境变量设置

交叉编译工具链需要三个关键环境变量:PATH、CROSS_COMPILE 和 ARCH。正确配置后,Makefile 和构建脚本才能自动找到正确的编译器。

交叉编译环境变量作用域 PATH 定位可执行文件 CROSS_COMPILE 指定编译器前缀 ARCH 指定目标架构 Linux Kernel / OP-TEE OS / U-Boot 构建系统 ARM64 可执行文件 / 镜像 三个变量缺一不可:PATH 让系统找到工具链,CROSS_COMPILE 让 Makefile 知道前缀,ARCH 让代码选择正确的架构分支

4.2.1 临时设置(当前终端有效)

# 如果使用 APT 安装,工具链在系统默认 PATH 中,通常只需设置后两个
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-

# 如果使用 Linaro 预编译包,需要先添加 PATH
export PATH=/opt/aarch64-toolchain/bin:$PATH
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-

4.2.2 永久设置(推荐)

将环境变量写入用户配置文件,每次登录自动生效:

# 编辑 ~/.bashrc 或 ~/.profile
echo 'export PATH=/opt/aarch64-toolchain/bin:$PATH' >> ~/.bashrc
echo 'export ARCH=arm64' >> ~/.bashrc
echo 'export CROSS_COMPILE=aarch64-linux-gnu-' >> ~/.bashrc

# 立即生效
source ~/.bashrc
常见错误:
  • CROSS_COMPILE 末尾缺少连字符:aarch64-linux-gnu 是错误的,必须是 aarch64-linux-gnu-,否则 Makefile 拼接出的命令是 aarch64-linux-gnugcc 而非 aarch64-linux-gnu-gcc。
  • ARCH 设置错误:OP-TEE 和 Linux 内核使用 arm64,而非 aarch64 或 ARM64。
  • PATH 覆盖:如果系统同时安装了多个工具链,确保目标工具链的 PATH 排在前面。

4.3 验证工具链配置

完成安装和环境变量设置后,执行以下验证步骤:

  1. 检查编译器版本
aarch64-linux-gnu-gcc --version
# 输出示例:
# aarch64-linux-gnu-gcc (Linaro GCC 9.2-2019.12) 9.2.1 20191125
# Copyright (C) 2019 Free Software Foundation, Inc.
  1. 编译测试程序
# 编写一个简单的 C 程序
echo '#include <stdio.h>
int main() {
    printf("Hello, TrustZone!\n");
    return 0;
}' > hello.c

# 交叉编译
aarch64-linux-gnu-gcc -o hello.arm64 hello.c

# 查看生成的文件类型
file hello.arm64
# 输出示例:
# hello.arm64: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 3.7.0, not stripped
  1. 验证环境变量
echo "ARCH = $ARCH"
echo "CROSS_COMPILE = $CROSS_COMPILE"
echo "PATH contains aarch64: $(echo $PATH | grep -o 'aarch64' | head -1)"
快速诊断:如果 file 命令显示 ELF 64-bit LSB executable, ARM aarch64,说明交叉编译成功。如果显示 x86-64,说明使用了本地编译器,请检查 CROSS_COMPILE 是否生效。

4.4 多版本工具链管理

在同时维护多个项目时,可能需要不同版本的工具链。推荐使用 环境模块(environment-modules)或 Makefile 内联设置:

# 在项目 Makefile 中覆盖环境变量
# 每个项目独立指定,互不干扰
export CROSS_COMPILE ?= aarch64-linux-gnu-
export ARCH ?= arm64

# 如果使用特定路径的工具链
TOOLCHAIN_PATH ?= /opt/aarch64-toolchain-9.2
export PATH := $(TOOLCHAIN_PATH)/bin:$(PATH)
管理方式 优点 缺点 推荐场景
全局环境变量 配置简单,所有项目共享 版本冲突,切换不便 个人开发机,单一项目
Makefile 内联 项目隔离,版本锁定 每个项目需重复配置 团队协作,CI/CD 流水线
环境模块 动态切换,支持多版本 需要额外安装配置 服务器多用户,复杂环境

4.5 本章小结

  • ARM64 交叉编译工具链是 TrustZone 和 OP-TEE 开发的基石,必须正确安装和配置。
  • 三个核心环境变量 PATH、CROSS_COMPILE、ARCH 缺一不可,且值必须精确(注意连字符和大小写)。
  • 通过编译测试程序并检查文件类型,可以快速验证工具链是否正常工作。
  • 在多项目环境中,推荐使用 Makefile 内联或环境模块管理工具链版本,避免全局冲突。