U-Boot源码分析3—make
从【嵌入式移植】4、U-Boot源码分析1—Makefile文章中可知执行make
命令的时候,没有指定目标则使用默认目标PHONY
,PHONY
依赖项为_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
包含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
这些目标具体是什么用处呢,结合【嵌入式移植】3、编译U-Boot中U-Boot的编译和烧写过程,最终是将编译生成的sunxi-spl.bin
和u-boot.itb
烧写到SD卡上
其中u-boot.itb
在ALL-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
制作而来;而查看顶层Makefile
,spl/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-spl
与u-boot-spl-platdata
、u-boot-spl-init
、u-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-y
在arch/arm/Makefile
中有定义:head-y := arch/arm/cpu/$(CPU)/start.o
即arch/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启动过程进行分析
完结撒花✿✿ヽ(°▽°)ノ✿