目錄
make 過程
make 過程
配置好 uboot 以后就可以直接make 編譯了,因?yàn)闆]有指明目標(biāo),所以會(huì)使用默認(rèn)目標(biāo),主 Makefile 中的默認(rèn)目標(biāo)如下:
?目標(biāo)_all 又依賴于all,如下所示:
如果KBUILD_EXTMOD為空的話_all 依 賴 于all 。這 里 不 編 譯 模 塊,所 以KBUILD_EXTMOD肯定為空,_all 的依賴就是all。在主 Makefile中all目標(biāo)規(guī)則如下:
從802行可以看出,all目標(biāo)依賴$(ALL-y),而在頂層Makefile中,ALL-y如下:
?從示例代碼代碼可以看出,ALL-y 包含 u-boot.srec、u-boot.bin、u-boot.sym、System.map、u-boot.cfg 和 binary_size_check 這幾個(gè)文件。根據(jù) uboot 的配置情況也可能包含其 他的文件,比如:
ALL-$(CONFIG_ONENAND_U_BOOT) += u-boot-onenand.bin?
CONFIG_ONENAND_U_BOOT就是uboot中跟ONENAND配置有關(guān)的,如果我們使能ONENAND,那么在.config 配置文件中就會(huì)有“CONFIG_ONENAND_U_BOOT=y”這一句。相 當(dāng)于 CONFIG_ONENAND_U_BOOT 是個(gè)變量,這個(gè)變量的值為“y”,所以展開以后就是:
?ALL-y += u-boot-onenand.bin
這個(gè)就是.config 里面的配置參數(shù)的含義,這些參數(shù)其實(shí)都是變量,后面跟著變量值,會(huì)在 頂層 Makefile 或者其他 Makefile 中調(diào)用這些變量。
ALL-y 里面有個(gè)u-boot.bin,這個(gè)就是我們最終需要的uboot二進(jìn)制可執(zhí)行文件,所作的所有工作就是為了它。在頂層Makefile中找到u-boot.bin目標(biāo)對(duì)應(yīng)的規(guī)則,如下所示:
第825行判斷CONFIG_OF_SEPARATE是否等于y如果相等,那條件就成立,在.config中搜索“CONFIG_OF_SEPARAT”,沒有找到,說明條件不成立。
第832行就是目標(biāo)u-boot.bin的規(guī)則,目標(biāo)u-boot.bin依賴于u-boot-nodtb.bin,命令為$(call if_changed,copy) ,這里調(diào)用了 if_changed ,if_changed是一個(gè)函數(shù),?這個(gè)函數(shù)在scripts/Kbuild.include中有定義,而頂層Makefile中會(huì)包含scripts/Kbuild.include 文件,這個(gè)前面已經(jīng)說過了。if_changed 在 Kbuild.include 中的定義如下:?
?第227行為if_changed的描述,根據(jù)描述,在一些先決條件比目標(biāo)新的時(shí)候,或者命令行 有改變的時(shí)候,if_changed就會(huì)執(zhí)行一些命令。
第257行就是函數(shù)if_changed,if_changed函數(shù)引用的變量比較多,也比較繞,我們只需要知道它可以從u-boot-nodtb.bin生成u-boot.bin就行了。
既然u-boot.bin依賴于u-boot-nodtb.bin,那么肯定要先生成u-boot-nodtb.bin文件,頂層Makefile中相關(guān)代碼如下:
?目標(biāo)u-boot-nodtb.bin又依賴于u-boot,頂層Makefile中u-boot相關(guān)規(guī)則如下:
?目標(biāo)u-boot依賴于u-boot_init、u-boot-main和u-boot.lds,u-boot_init和u-boot-main是兩個(gè)變量,在頂層Makefile中有定義,值如下:
$(head-y)跟CPU架構(gòu)有關(guān),我們使用的是ARM芯片,所以head-y在arch/arm/Makefile中被指定為:
head-y := arch/arm/cpu/$(CPU)/start.o
根據(jù)分析,我們知道CPU=armv7,因此head-y展開以后就是:
?head-y := arch/arm/cpu/armv7/start.o
因此:?
u-boot-init= arch/arm/cpu/armv7/start.o?
$(libs-y)在頂層Makefile中被定義為uboot所有子目錄下build-in.o的集合,代碼如下:
從上面的代碼可以看出,libs-y都是uboot各子目錄的集合,最后:??
libs-y := $(patsubst %/, %/built-in.o, $(libs-y)) ?
這里調(diào)用了函數(shù)patsubst,將libs-y中的“/”替換為”/built-in.o”,比如“drivers/dma/”就變?yōu)榱恕?/span>drivers/dma/built-in.o”,相當(dāng)于將libs-y改為所有子目錄中built-in.o文件的集合。那么u-boot-main就等于所有子目錄中built-in.o的集合。
這個(gè)規(guī)則就相當(dāng)于將以u-boot.lds為鏈接腳本,將arch/arm/cpu/armv7/start.o和各個(gè)子目錄
下的built-in.o鏈接在一起生成u-boot。
u-boot.lds的規(guī)則如下:
接下來的重點(diǎn)就是各子目錄下的built-in.o是怎么生成的,以 drivers/gpio/built-in.o為例,在drivers/gpio/目錄下會(huì)有個(gè)名為.built-in.o.cmd 的文件,此文件內(nèi)容如下:
?從命令“cmd_drivers/gpio/built-in.o”可以看出,drivers/gpio/built-in.o這個(gè)文件是使用ld命令由文件 drivers/gpio/mxc_gpio.o生成而來的,mxc_gpio.o是mxc_gpio.c編譯生成的.o文件,這個(gè)是NXP的 I.MX系列的GPIO驅(qū)動(dòng)文件。這里用到了ld的“-r”參數(shù),參數(shù)含義如下:
-r –relocateable:?產(chǎn)生可重定向的輸出,比如,產(chǎn)生一個(gè)輸出文件它可再次作為‘ld’的輸入,這經(jīng)常被叫做“部分鏈接”,當(dāng)我們需要將幾個(gè)小的.o文件鏈接成為一個(gè).o文件的時(shí)候,需要使用此選項(xiàng)。最終將各個(gè)子目錄中的built-in.o文件鏈接在一起就形成了u-boot,使用如下命令編譯uboot就可以看到鏈接的過程:
?編譯的時(shí)候會(huì)有如圖所示內(nèi)容輸出:
?將其整理一下,內(nèi)容如下:
可以看出最終是用arm-linux-gnueabihf-ld.bfd命令將arch/arm/cpu/armv7/start.o和其他眾多的 built_in.o鏈接在一起,形成 u-boot。
目標(biāo)all除了u-boot.bin以外還有其他的依賴,比如 u-boot.srec 、u-boot.sym 、System.map、 u-boot.cfg和binary_size_check等等,這些依賴的生成方法和u-boot.bin很類似,大家自行查看 一下頂層 Makefile。
?
總結(jié)一下“make”命令的流程,如圖所示:
?
圖就是“make”命令的執(zhí)行流程,關(guān)于uboot的頂層Makefile就分析到這里,重點(diǎn)是“make xxx_defconfig”和“make”這兩個(gè)命令的執(zhí)行流程:
make xxx_defconfig:用于配置uboot,這個(gè)命令最主要的目的就是生成.config 文件。文章來源:http://www.zghlxwxcb.cn/news/detail-433901.html
make:用于編譯uboot,這個(gè)命令的主要工作就是生成二進(jìn)制的u-boot.bin文件和其他的一 些與 uboot有關(guān)的文件,比如u-boot.imx等等。 文章來源地址http://www.zghlxwxcb.cn/news/detail-433901.html
到了這里,關(guān)于08_Uboot頂層Makefile分析_make過程的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!