📦 U-Boot 编译生成的文件详解

当你执行 make rv1106_defconfigmake -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

  • 功能:

    1. 初始化 DDR 内存
    2. 初始化时钟
    3. 从存储设备加载主 U-Boot (u-boot.bin)
    4. 跳转到主 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 启动:

你需要的是:

  1. spl/u-boot-spl.bin → 打包到 rv1106_idblock_*.img
  2. 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