3. 构建环境搭建

好,咱们直接进入正题。ATF 移植的第一步,就是把环境搭起来。这一步看着简单,但坑是真不少。我见过太多人卡在编译阶段,最后发现是工具链版本不对,或者某个依赖库没装。说白了,环境搭不好,后面全是白费功夫。

3.1 交叉编译工具链的选择与配置

ATF 是跑在 ARM 平台上的,所以你得用交叉编译器。我个人习惯用 Linaro 的 GCC 工具链,稳定,社区支持也好。当然,ARM 官方也有 GNU-A 系列的工具链,看个人喜好。

工具链版本建议:

  • GCC 版本:建议 7.3 以上,但别超过 10.x。太老的版本不支持新指令集,太新的版本有时会引入奇怪的编译问题。
  • 目标架构:根据你的芯片选。Cortex-A53 选 aarch64,Cortex-A7 选 arm32。
  • 我遇到过用 GCC 11 编译 ATF 2.6,结果链接阶段报了一堆 undefined reference,最后换回 9.2 就好了。

配置步骤:

  1. 下载工具链,解压到 /opt/toolchains/ 目录。
  2. 设置环境变量:export CROSS_COMPILE=aarch64-linux-gnu-
  3. 验证:${CROSS_COMPILE}gcc --version,能正常输出版本号就行。
小技巧: 我习惯把工具链路径写到 ~/.bashrc 里,省得每次开终端都要 export 一遍。但注意,不同项目可能用不同工具链,别搞混了。

3.2 依赖库安装

ATF 编译需要一些基础库。别小看这一步,缺一个库,编译就卡住。我列个清单,你照着装就行。

依赖库 用途 安装命令(Ubuntu/Debian)
build-essential 基础编译工具 sudo apt install build-essential
libssl-dev 加密支持(如 TBB) sudo apt install libssl-dev
device-tree-compiler 设备树编译 sudo apt install device-tree-compiler
python3-pip 脚本支持 sudo apt install python3-pip

嗯,这里要注意:如果你要启用 Trusted Board Boot(TBB),那 libssl-dev 是必须的。我之前有个项目,忘了装这个,结果编译到一半报错说找不到 openssl/ssl.h,折腾了半天才发现。

3.3 常见构建错误及解决

这部分是我最想跟你聊的。编译错误千奇百怪,但总结下来,就那么几类。我挑几个典型的说说。

3.3.1 错误:arm-linux-gnueabihf-gcc: command not found

原因: 工具链没加到 PATH 里,或者路径写错了。

解决: 检查 $PATH 是否包含工具链的 bin 目录。我建议用绝对路径,别偷懒。

export PATH=/opt/toolchains/gcc-arm-9.2-2019.12-x86_64-aarch64-none-elf/bin:$PATH

3.3.2 错误:fatal error: openssl/ssl.h: No such file or directory

原因: 没装 libssl-dev,或者装了但 ATF 没找到。

解决: 先确认库是否安装:dpkg -l | grep libssl。如果装了还报错,试试设置 OPENSSL_DIR 环境变量。

警告: 别用系统自带的 openssl 路径硬编码,不同发行版路径不一样。用环境变量更灵活。

3.3.3 错误:undefined reference to `armada_common_init'

原因: 平台代码没包含全,或者 Makefile 里漏了某个源文件。

解决: 检查 plat/ 目录下你的平台文件夹,看看 platform.mk 里有没有把需要的 .c 文件加进去。我曾经在移植 Marvell 平台时,漏了一个 marvell_common.c,链接阶段报了一堆 undefined reference,排查了整整一下午。

3.3.4 错误:Error: unknown architecture 'armv8.2-a'

原因: 工具链太老,不认识新的 ARM 架构版本。

解决: 升级工具链,或者修改 ATF 的 Makefile,指定一个工具链能识别的架构。比如把 armv8.2-a 改成 armv8-a,但这样可能会丢失一些优化。

3.4 知识体系结构图

下面这张图,是我自己总结的 ATF 构建环境的核心逻辑。你照着这个思路来,基本不会跑偏。

ATF 构建环境核心逻辑 交叉编译工具链 系统依赖库 平台配置与 Makefile • GCC 版本选择 • 环境变量配置 • 架构匹配 • libssl-dev • device-tree-compiler • python3 支持 • platform.mk 检查 • 源文件完整性 • 链接脚本 三者缺一不可,否则编译必报错 常见错误:command not found | ssl.h missing | undefined reference | unknown architecture

3.5 避坑指南

最后,我把自己踩过的坑总结一下,你遇到类似问题可以少走弯路。

  • 工具链版本别追新: 我曾经用 GCC 11 编译 ATF 2.4,结果链接阶段报了一堆莫名其妙的错误。后来换回 Linaro 的 7.5 版本,一次通过。稳定比新功能重要。
  • 环境变量别写错: CROSS_COMPILE 后面一定要带横杠,比如 aarch64-linux-gnu-。少个横杠,编译出来的东西可能跑不起来。
  • 依赖库装全: 别只装你觉得需要的。ATF 的文档里写了哪些依赖,就老老实实全装上。我见过有人没装 device-tree-compiler,结果编译设备树时报错,排查了半天才发现。
  • Makefile 别乱改: 除非你完全清楚自己在做什么,否则别动 ATF 自带的 Makefile。我见过有人为了省事,把 PLAT 变量写死,结果换平台时忘了改,编译出来的东西完全不对。

总结一下: 构建环境搭建,说白了就是三件事——选对工具链、装全依赖库、配好平台文件。这三件事做好了,编译基本不会出问题。如果还报错,别慌,先看错误信息,八成是路径问题或者版本问题。

嗯,今天就聊到这儿。环境搭好了,下一步就是真正的移植工作了。到时候咱们再细聊。