_all: 第一个目标 执行这个
1 | # 这是我们的默认目标,当命令行上没有给出 |
all:
1 | # Timestamp 文件,以确保 binman 始终运行 |
- 依赖
$(INPUTS-y)
,优先执行
依赖 $(INPUTS-y) 导入特定规则
1 | -include include/autoconf.mk |
所以
INPUTS-y
在arch/arm/config.mk
中导入1
2makefile (从“arch/arm/config.mk”,行 131)
INPUTS-y = checkarmreloc1
2
3
4ifneq ($(CONFIG_XPL_BUILD),y)
# Check that only R_ARM_RELATIVE relocations are generated.
INPUTS-y += checkarmreloc
endif所以
$INPUTS-y = checkarmreloc u-boot.srec u-boot.bin u-boot.sym System.map binary_size_check
checkarmreloc 检查ARM重定向 32或64位
u-boot.srec 进行对u-boot文件进行空白填充0XFF处理
u-boot.bin 生成u-boot.bin文件, 把u-boot-nodtb.bin和dts/dt.dtb打包成u-boot-dtb.bin,然后重命名为u-boot.bin
u-boot.sym: 生成 u-boot.sym 文件,该文件包含 u-boot 二进制文件的符号表
1 | quiet_cmd_sym ?= SYM $@ |
- System.map: 生成 System.map 文件,该文件包含 u-boot 二进制文件的符号表
1 | SYSTEM_MAP = \ |
- binary_size_check:bin文件是否超过范围大小
KCONFIG_CONFIG
1 | KCONFIG_CONFIG ?= .config |
$(KCONFIG_CONFIG) include/config/auto.conf.cmd: ;
- 这条语句定义了一个目标,它包含两个文件:$(KCONFIG_CONFIG) 和 auto.conf.cmd。当这两个文件被调用时,执行一个空命令;这意味着这两个文件是一起作为一个目标的,只有在这两个文件都存在时,才会执行空命令
autoconf_is_old 判断autoconf有更新,导入规则文件
1 | # 我们只希望在 include/config/auto.conf 是最新的时才包含 arch/$(ARCH)/config.mk。 |
config.mk – 导入特定的规则 cpu,架构,board等特殊规则导入
- 从顶层makefile中导入
1 | #从顶层makefile |
checkarmreloc 检查ARM重定向 32或64位
1 | # ARM 重定位应全部为 R_ARM_RELATIVE(32 位)或 R_AARCH64_RELATIVE(64 位) |
u-boot.srec 对u-boot文件进行空白填充0XFF处理 把u-boot中的指定段拷到u-boot.srec中
1 | u-boot.hex u-boot.srec: u-boot FORCE |
objcopy工具
- objcopy 是一个用于处理目标文件的工具,通常用于转换、修改和提取二进制文件中的内容。它是 GNU Binutils 工具链的一部分,广泛应用于嵌入式系统开发和其他需要处理二进制文件的领域。
- 格式转换:objcopy 可以将目标文件从一种格式转换为另一种格式。例如,可以将 ELF 格式的文件转换为纯二进制格式。
- 提取和合并:objcopy 可以从目标文件中提取特定的段或节,也可以将多个目标文件合并为一个文件。
- 修改内容:objcopy 可以修改目标文件的内容,例如填充空白区域、修改符号表、调整段的地址等。
- 生成调试信息:objcopy 可以从目标文件中分离或添加调试信息。
- 常用选项
1 | -O:指定输出文件的格式。例如,-O binary 将输出文件转换为纯二进制格式。 |
-j sectionname , --only-section=sectionname
: 只将由 sectionname 指定的 section 拷贝到输出文件,可以多次指定,并且注意如果使用不当会导致输出文件不可用。-O bfdname
:–output-target= bfdname 使用指定的格式来写输出文件(即目标文件),bfdname是BFD库中描述的标准格式名。
$(OBJCOPYFLAGS)
- $(OBJCOPYFLAGS)定义在顶层config.mk和arch/ $(ARCH)/config.mk(arch/arm/config.mk)中
1 | # config.mk |
u-boot 生成u-boot文件
- 首先生成xxx_build-in.o 和 start.o 和 lds文件;然后链接生成u-boot文件
1 | #顶层 makefile |
$(u-boot-init)
为arch/arm/cpu/armv7m/start.o
$(u-boot-main)
为lib配置和厂家配置
各层驱动目录下build-in.o的集合$(u-boot-keep-syms-lto)
为空
u-boot.lds
为 生成u-boot.lds
$(xxx-y) 为xxx_config = y 时的变量
$(libs-y)被定义为各层驱动目录下build-in.o的集合
1 | #顶层 makefile |
machine-y machine厂家配置
1 | # arch/arm/Makefile |
u-boot.lds 生成链接器脚本
- 调用原始的lds脚本生成需要的lds脚本
- 在预处理过程中,GCC 预处理器会移除注释。这是因为预处理器的主要任务是处理宏定义、条件编译指令和文件包含指令,而注释对于编译器来说是无关紧要的,因此会被移除。
- 预处理器的行为
- 宏展开:预处理器会展开所有的宏定义。例如,#define 指令定义的宏会被替换为其对应的值。
- 条件编译:预处理器会处理所有的条件编译指令,例如 #ifdef、#ifndef、#if、#else 和 #endif。
- 文件包含:预处理器会处理所有的文件包含指令,例如 #include,并将包含的文件内容插入到预处理后的文件中。
- 移除注释:预处理器会移除所有的注释,包括单行注释()和多行注释(/* … */)
- 预处理器通常不会根据文件后缀来决定是否对文件进行预处理,而是根据命令行选项和文件内容来决定如何处理文件。
- 所以使用了预处理器处理原始的lds脚本生成新的lds脚本
1 | # $@ 代表目标文件名u-boot.lds在顶层目录下 |
LDSCRIPT 找到链接器脚本路径
- arch/arm/cpu/u-boot.lds
- 如果没有定义LDSCRIPT和CONFIG_SYS_LDSCRIPT,则默认使用u-boot自带的lds文件,包括board/$ (BOARDDIR)和$ (CPUDIR)目录下定制的针对board或cpu的lds文件;如果没有定制的lds文件,则采用arch/$(ARCH)/cpu目录下默认的lds文件。
1 | # 如果板代码明确指定了 LDSCRIPT 或 CONFIG_SYS_LDSCRIPT,则使用它(如果没有,则失败)。 否则,请在标准位置搜索链接器脚本。 |
prepare系列目标依赖
1 | # 顶层 makefile |
$(version_h) $(timestamp_h) $(dt_h) $(env_h)
1 | version_h := include/generated/version_autogenerated.h |
include/config/uboot.release 生成版本号
- 使用scripts/setlocalversion工具来生成include/config/uboot.release
1 | # Store (new) UBOOTRELEASE string in include/config/uboot.release |
filechk_xxx Filechk 用于检查生成的文件内容是否更新
1 | # scripts/Kbuild.include |
if_changed 执行命令 if_changed_dep 用于生成依赖文件 .d
1 | ifneq ($(KBUILD_NOCMDDEP),1) |
u-boot.bin 把u-boot-dtb.bin 重命名为u-boot.bin
1 | # 根据配置依赖不同的文件 |
u-boot-dtb.bin 把u-boot-nodtb.bin和dts/dt.dtb打包成u-boot-dtb.bin
- 把u-boot-nodtb.bin和dts/dt.dtb打包成u-boot-dtb.bin
1 | cmd_cat = cat $(filter-out $(PHONY), $^) > $@ |
u-boot-nodtb.bin 对u-boot文件进行空白填充0XFF处理 把u-boot中的指定段拷到u-boot-nodtb.bin
1 | # 静态应用 RELA 样式的重定位(目前仅限 arm64) |
dts/dt.dtb 生成对应的dtb文件
1 | dtbs_prepare: prepare3 #检查是否在output目录中构建 |
- 指定目标dtbs,在Makefile.build中会引用dts目录下的Makefile。展开如下
1 | # dts/Makefile |
arch-dtbs 生成scripts/dtc/dtc文件
1 | # dts/Makefile |
- 规则就是执行:
make -f $(srctree)/scripts/Makefile.build obj=arch/arm/dts dtbs
命令。目标dtbs定义在scripts/Makefile.dts中 - 调用scripts/dtc/dtc 工具生成对应的dtb文件,同时生成*.d文件
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 wdfk-prog的个人博客!
评论