📦 U-Boot 编译生成的文件详解
当你执行 make rv1106_defconfig 和 make -j16 后,会生成以下关键文件:
1. 核心镜像文件
u-boot.bin ✅ 最重要的文件
# 这是最终的 U-Boot 二进制镜像
# 包含:U-Boot 主程序 + 设备树(DTB)
ls -lh u-boot.bin
- 内容:完整的 U-Boot 可执行代码
- 格式:原始二进制格式
- 用途:可以直接烧录到存储设备
- 加载地址:由
CONFIG_SYS_TEXT_BASE决定(RV1106 是0x00200000)
u-boot-nodtb.bin
# U-Boot 主程序(不包含设备树)
ls -lh u-boot-nodtb.bin
- 内容:纯 U-Boot 代码,不含设备树
- 用途:用于 FIT 镜像打包,或与外部 DTB 合并
- 大小:比
u-boot.bin小(少了 DTB)
u-boot.dtb
# 设备树二进制文件
ls -lh u-boot.dtb
- 内容:硬件描述信息(内存、外设、引脚等)
- 来源:从
.dts文件编译而来 - 用途:告诉 U-Boot 板子的硬件配置
2. SPL/TPL 相关文件
spl/u-boot-spl.bin
# Secondary Program Loader (二级引导程序)
ls -lh spl/u-boot-spl.bin
-
作用:第一个运行的代码(在 DDR 初始化之前)
-
大小:通常 < 128KB
-
功能:
- 初始化 DDR 内存
- 初始化时钟
- 从存储设备加载主 U-Boot (
u-boot.bin) - 跳转到主 U-Boot
tpl/u-boot-tpl.bin(如果有)
# Tertiary Program Loader (三级引导程序)
ls -lh tpl/u-boot-tpl.bin
- 作用:比 SPL 更早运行(在某些平台上)
- 功能:初始化最基本的硬件(SRAM、时钟)
3. FIT 镜像相关文件
u-boot.img
# 带 mkimage 头部的 U-Boot 镜像
ls -lh u-boot.img
-
内容:
u-boot.bin+ 64 字节的头部信息 -
头部包含:
- 魔数(0x27051956)
- 加载地址
- 入口地址
- 镜像大小
- CRC 校验码
- 镜像名称
-
用途:U-Boot 可以通过
bootm命令加载这种格式
u-boot-dtb.img
# 包含设备树的 FIT 格式镜像(如果启用 FIT)
ls -lh u-boot-dtb.img
- 内容:U-Boot + DTB 的 FIT 格式打包
- 用途:支持更灵活的镜像管理
u-boot.itb(Image Tree Blob)
# FIT 格式的完整镜像
ls -lh u-boot.itb
-
内容:可以包含多个组件(SPL、U-Boot、DTB、TEE 等)
-
格式:基于设备树的镜像描述
-
优势:
- 支持签名验证
- 支持多个配置选项
- 支持压缩
4. 调试和符号文件
u-boot.sym
# 符号表文件
ls -lh u-boot.sym
cat u-boot.sym | head -20
-
内容:所有函数和变量的地址映射
-
格式:
地址 类型 名称 -
用途:
- 调试时查找崩溃位置
- 分析内存布局
- 使用
addr2line转换地址到源码行号
示例:
00200000 T _start
00200100 t board_init_f
00210000 T main_loop
u-boot.map
bash# 链接映射文件(非常详细)
ls -lh u-boot.map
head -50 u-boot.map
-
内容:完整的内存布局信息
-
包含:
- 每个段的位置和大小
- 每个函数的地址
- 全局变量的位置
- 内存使用情况统计
-
用途:
- 优化内存使用
- 调试链接问题
- 分析代码大小
示例输出:
Memory Configuration
Name Origin Length Attributes
*default* 0x00000000 0xffffffff
Linker script and memory map
.text 0x00200000 0x123456
0x00200000 . = ALIGN (0x4)
0x00200000 _start = .
*(.text._start)
.text._start 0x00200000 0x80 arch/arm/cpu/armv7/start.o
System.map
# 系统符号映射(类似 u-boot.sym)
ls -lh System.map
- 内容:内核风格的符号表
- 用途:与 Linux 内核工具兼容
5. ELF 格式文件
u-boot(无扩展名)
# ELF 格式的可执行文件
ls -lh u-boot
file u-boot
-
格式:ELF(Executable and Linkable Format)
-
内容:包含调试信息、符号表、重定位信息
-
用途:
- GDB 调试
- 反汇编分析
- 查看详细的段信息
常用命令:
# 查看 ELF 头信息
readelf -h u-boot
# 查看段信息
readelf -S u-boot
# 反汇编
arm-linux-gnueabihf-objdump -D u-boot > u-boot.dis
# 提取特定段
arm-linux-gnueabihf-objcopy -O binary -j .text u-boot u-boot-text.bin
u-boot.srec
# Motorola S-Record 格式
ls -lh u-boot.srec
- 格式:文本格式的十六进制数据
- 用途:用于某些编程器或仿真器
u-boot.hex
# Intel HEX 格式
ls -lh u-boot.hex
- 格式:文本格式的十六进制数据
- 用途:用于 JTAG 烧录或仿真器
6. Rockchip 特定文件
当你使用 ./make.sh 编译时,还会生成:
uboot.img
bash# Rockchip 格式的 U-Boot 镜像
ls -lh uboot.img
-
内容:经过 Rockchip 工具处理的 U-Boot
-
特点:
- 添加了 Rockchip 特定的头部
- 可能进行了加密或签名
- 对齐到特定边界
trust.img
# ARM Trusted Firmware / OP-TEE 镜像
ls -lh trust.img
- 内容:安全世界固件(ATF 或 TEE)
- 用途:提供安全启动支持
rv1106_idblock_*.img
# IDB(Initial Data Block)镜像
ls -lh rv1106_idblock_v*.img
- 内容:DDR 初始化代码 + SPL
- 用途:第一个被 ROM Code 加载的代码块
- 烧录位置:SPI Flash/NAND 的 offset 0x0
rv1106_download_*.bin
# 完整的下载镜像
ls -lh rv1106_download_v*.bin
- 内容:DDR + SPL + U-Boot + Trust 的完整打包
- 用途:通过 USB 一次性烧录所有内容
📊 文件关系流程图
源代码 (.c, .S)
↓
编译 (.o 文件)
↓
链接
↓
┌─────────────────────────────────────┐
│ u-boot (ELF 格式) │ ← 用于 GDB 调试
└─────────────────────────────────────┘
↓ objcopy (去除调试信息)
┌─────────────────────────────────────┐
│ u-boot-nodtb.bin (二进制) │ ← 纯 U-Boot 代码
└─────────────────────────────────────┘
↓ cat (合并设备树)
┌─────────────────────────────────────┐
│ u-boot.bin (二进制) │ ← 可直接烧录
└─────────────────────────────────────┘
↓ mkimage (添加头部)
┌─────────────────────────────────────┐
│ u-boot.img (带头部) │ ← bootm 加载
└─────────────────────────────────────┘
↓ rkbin 工具打包
┌─────────────────────────────────────┐
│ uboot.img (Rockchip 格式) │ ← 最终烧录
└─────────────────────────────────────┘
同时:
spl/ 目录生成 → spl/u-boot-spl.bin → 打包到 idblock.img
🔍 如何查看文件内容
1. 查看文件大小和类型
file u-boot*
ls -lh u-boot*
2. 查看符号表
# 查看所有符号
arm-linux-gnueabihf-nm u-boot | head -20
# 查看特定函数
arm-linux-gnueabihf-nm u-boot | grep board_init
# 按大小排序
arm-linux-gnueabihf-nm --size-sort u-boot | tail -20
3. 反汇编
# 反汇编整个文件
arm-linux-gnueabihf-objdump -D u-boot > u-boot.dis
# 反汇编特定函数
arm-linux-gnueabihf-objdump -D u-boot | grep -A 20 "<board_init_f>:"
# 交互式反汇编
arm-linux-gnueabihf-objdump -d -S u-boot | less
4. 查看段信息
# 查看所有段
readelf -S u-boot
# 查看程序头
readelf -l u-boot
# 查看符号
readelf -s u-boot
5. 提取特定部分
# 只提取 .text 段
arm-linux-gnueabihf-objcopy -O binary -j .text u-boot text_only.bin
# 提取 .rodata 段
arm-linux-gnueabihf-objcopy -O binary -j .rodata u-boot rodata_only.bin
💡 实际使用建议
对于 RV1106 SPI NAND 启动:
你需要的是:
- spl/u-boot-spl.bin → 打包到
rv1106_idblock_*.img - u-boot.bin → 打包到
uboot.img
手动编译步骤:
cd /root/rk-tools/u-boot
# 1. 配置
make rv1106-spi-nand-tb_defconfig
# 2. 修改 .config(禁用 META)
scripts/config --disable CONFIG_ROCKCHIP_META
# 3. 编译
make -j16 CROSS_COMPILE=arm-linux-gnueabihf-
# 4. 检查生成的文件
ls -lh u-boot.bin spl/u-boot-spl.bin
# 5. 使用 rkbin 工具打包(需要 make.sh 或手动调用脚本)
cd ../uboot # 回到有 make.sh 的目录
./make.sh loader # 打包 loader
./make.sh uboot # 打包 uboot