4. 编译U-Boot(通用配置)
任务目标
本案例要求使用U-Boot源码树自带的默认配置完成一次通用编译,最终在源码目录下生成u-boot.bin(或u-boot ELF文件)等关键构建产物。该过程验证交叉编译工具链与源码配置的匹配性,为后续针对具体开发板的定制编译建立基线。
环境与依赖
- Linux主机(x86_64或aarch64均可),已安装
make、gcc等基础构建工具。 - 交叉编译工具链(若目标为ARM板卡):
arm-linux-gnueabihf-系列,需提前加入PATH。 - U-Boot源码树(版本≥2020.01),已解压至工作目录。
实现步骤与代码
U-Boot的编译分为两步:先加载默认配置,再执行编译。以下命令在U-Boot源码根目录下执行。
# 1. 加载通用默认配置(以qemu-arm为例,该配置不依赖具体硬件外设)
make qemu-arm_defconfig
# 2. 执行编译,生成u-boot.bin
# 若使用交叉编译,需指定CROSS_COMPILE前缀
make CROSS_COMPILE=arm-linux-gnueabihf- -j$(nproc)
若主机未安装ARM交叉工具链,可先使用原生x86配置验证编译流程:
# 原生编译(仅用于验证工具链与源码完整性)
make sandbox_defconfig
make -j$(nproc)
关键产物说明
编译成功后,源码根目录下应出现以下文件(以qemu-arm_defconfig为例):
u-boot:ELF格式的U-Boot可执行文件,含调试符号。u-boot.bin:纯二进制镜像,可直接烧录或加载。u-boot.map:链接映射文件,记录符号地址分布。config.mk/include/config.h:由默认配置自动生成的编译配置头文件。
验证方法与判定标准
执行以下命令确认构建产物完整且可识别:
# 检查关键文件是否存在且非空
ls -l u-boot u-boot.bin
# 查看二进制文件头,确认架构正确(ARM 32位输出 "ELF 32-bit LSB executable, ARM")
file u-boot
判定通过的三个条件:
make命令以退出码0结束,无Error或undefined reference报错。u-boot.bin文件存在且大小大于100KB(不同配置略有差异,但不应为0字节)。file u-boot输出的架构信息与CROSS_COMPILE指定的目标架构一致(例如ARM交叉编译应显示ARM架构)。
常见问题
- 错误:
arm-linux-gnueabihf-gcc: command not found—— 工具链未安装或未加入PATH,请先安装交叉编译器或使用路径。 - 错误:
make[1]: *** No rule to make target 'qemu-arm_defconfig'—— 源码目录不正确或源码不完整,确认在U-Boot根目录执行,且configs/目录下存在对应defconfig文件。 - 编译中断于
scripts/dtc—— 缺少设备树编译器依赖,执行apt install device-tree-compiler(Debian/Ubuntu)后重新编译。
本案例仅验证通用编译流程,生成的u-boot.bin为QEMU虚拟平台镜像,不可直接烧录至真实ARM开发板。针对具体板卡的配置与编译将在后续案例中展开。