【嵌入式移植】6、U-Boot源码分析3—make

本文详细分析了U-Boot源码中Makefile的默认目标设置,以及关键文件如spl/u-boot-spl.bin的编译过程,涉及到了ALL-y目标列表和MKSUNXI工具的使用。
摘要由CSDN通过智能技术生成

U-Boot源码分析3—make

【嵌入式移植】4、U-Boot源码分析1—Makefile文章中可知执行make命令的时候,没有指定目标则使用默认目标PHONYPHONY依赖项为_all all scripts_basic outputmakefile scripts dtbs

Makefile中第129行指定默认目标PHONY依赖_all,第198行指定_all依赖于all,第859行指明all依赖于$(ALL-y) cfg,而在第768行:
请添加图片描述
最终ALL-y的值为

ALL-y = checkarmreloc u-boot.srec u-boot.bin u-boot.sym System.map binary_size_check spl/u-boot-spl.bin u-boot.img u-boot.dtb u-boot-dtb.img u-boot.itb

ALL-y包含checkarmrelocu-boot.srecu-boot.binu-boot.symSystem.mapbinary_size_checkspl/u-boot-spl.binu-boot.imgu-boot.dtbu-boot-dtb.imgu-boot.itb

这些目标具体是什么用处呢,结合【嵌入式移植】3、编译U-Boot中U-Boot的编译和烧写过程,最终是将编译生成的sunxi-spl.binu-boot.itb烧写到SD卡上

其中u-boot.itbALL-y已经有了,那么sunxi-spl.bin又是怎么来的呢

查看编译过程
请添加图片描述
原来sunxi-spl.bin是使用MKSUNXI这个工具制作的,查看详细的编译过程输出,找到对应的语句(这里可以使用make CROSS_COMPILE=aarch64-linux-gnu- V=1语句输出详细的编译过程,单独保存下来查看)
请添加图片描述
原来sunxi-spl.bin是使用tools目录下的mksunxiboot工具,由spl/u-boot-spl.bi制作而来;而查看顶层Makefilespl/u-boot-spl.bi依赖于spl/u-boot-spl,而spl/u-boot-spl执行的命令为

spl/u-boot-spl: tools prepare \
		$(if $(CONFIG_OF_SEPARATE)$(CONFIG_SPL_OF_PLATDATA),dts/dt.dtb) \
		$(if $(CONFIG_OF_SEPARATE)$(CONFIG_TPL_OF_PLATDATA),dts/dt.dtb)
	$(Q)$(MAKE) obj=spl -f $(srctree)/scripts/Makefile.spl all

前几行为准备编译所需工具,最后一行执行scripts/Makefile.spl,目标为all

进入scripts/Makefile.spl文件,目标all依赖于$(ALL-y),而$(ALL-y)包括$(obj)/$(SPL_BIN).bin$(obj)/sunxi-spl.bin等,其实即需编译生成$(obj)/$(SPL_BIN).bin=spl/u-boot-spl.bin

查看$(obj)/$(SPL_BIN).bin依赖,根据变量定义,在scripts/Makefile.spl第232行~233行:

$(obj)/$(SPL_BIN).bin: $(obj)/$(SPL_BIN)-nodtb.bin FORCE
	$(call if_changed,copy)

可知spl/u-boot-spl.bin$(obj)/$(SPL_BIN)-nodtb.bin制作(与编译输出匹配cp spl/u-boot-spl-nodtb.bin spl/u-boot-spl.bin

在第303行~304行:

$(obj)/$(SPL_BIN)-nodtb.bin: $(obj)/$(SPL_BIN) FORCE
	$(call if_changed,objcopy)

可知spl/u-boot-spl-nodtb.bin$(obj)/$(SPL_BIN)通过编译工具aarch-linux-gnu-objcopy制作,对应编译过程输出为:

aarch64-linux-gnu-objcopy -j .text -j .secure_text -j .secure_data -j .rodata -j .data -j .u_boot_list -j .rela.dyn -j .got -j .got.plt -j .dtb.init.rodata -j .efi_runtime -j .efi_runtime_rel  -O binary  spl/u-boot-spl spl/u-boot-spl-nodtb.bin

在第356行~358行:

$(obj)/$(SPL_BIN): $(u-boot-spl-platdata) $(u-boot-spl-init) \
		$(u-boot-spl-main) $(obj)/u-boot-spl.lds FORCE
	$(call if_changed,u-boot-spl)

可知$(obj)/$(SPL_BIN)spl/u-boot-splu-boot-spl-platdatau-boot-spl-initu-boot-spl-main有关,通过$(obj)/u-boot-spl.lds链接脚本进行链接,生成spl/u-boot-spl
其中,由第99行~103行:

u-boot-spl-init := $(head-y)
u-boot-spl-main := $(libs-y)
ifdef CONFIG_$(SPL_TPL_)OF_PLATDATA
u-boot-spl-platdata := $(obj)/dts/dt-platdata.o
endif

由于CONFIG_TPL_BUILD只有 powerpc 的 mpc85xx存在,因此这里$(SPL_TPL_)的值为SPL_,而CONFIG_SPL_OF_PLATDATA未定义,因此u-boot-spl-platdata为空

u-boot-spl-init := $(head-y)head-yarch/arm/Makefile中有定义:head-y := arch/arm/cpu/$(CPU)/start.oarch/arm/cpu/armv8/start.o

libs-y在顶层Makefile中定义,即根据配置将所有用到的库路径保存在libs-y中,然后顶层Makefile第704行通过sort函数按照字母顺序升序排序,第710行通过patsubst函数将libs-y末尾的/替换成/built-in.o,即所有用到的库目录中的built-in.o的集合(详见【嵌入式移植】4、U-Boot源码分析1—Makefile

本章先分析到此处,后续结合U-Boot启动过程进行分析
完结撒花✿✿ヽ(°▽°)ノ✿

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值