u boot編譯分析

2021-07-16 15:32:28 字數 3092 閱讀 9016

在頂層目錄下執行完"make smdk2410_config"命令後,就把u-boot給配置好了,接著就可以在執行"make all"或者"make"命令去編譯u-boot了,完成後就可以燒寫到開發板去執行了。(在makefile中的all目標是第乙個目標,因為makefile將第乙個目標設為預設目標,make命令後如果不加目標就預設是makefile中的預設目標,所以執行"make all"命令是執行all目標,執行"make"其實也是執行all目標)。

分析頂層makefile檔案

1、include include/config.mk(包含在配置階段建立的include/config.mk)

export arch cpu board vendor soc (匯入在配置階段確定的變數)

export命令的作用:設定或顯示環境變數。(比如我們要用乙個命令,但這個命令的執行檔案不在當前目錄,這樣我們每次用的時候必須指定執行檔案的目錄,麻煩,在**中先執行export,這個相當於告訴程式,執行某某東西時,需要的檔案或什麼東東在這些目錄裡)。

在shell中執行程式時,shell會提供一組環境變數,export可新增,修改或刪除環境變數,供後續執行的程式使用。

2、cross_compile = arm-linux- (指定交叉編譯工具)

3、include config.mk (包含在頂層目錄下的config.mk檔案)

分析頂層config.mk檔案

1、boarddir = smdk2410 (確定開發板目錄為smdk2410)

2、sinclude board/smdk2410/config.mk(包含開發板相關的檔案;sinclude代表如果沒有該檔案就停止編譯,inuclude則不會停止)

3、ldscript := /board/smdk2410/u-boot.lds (包含開發板相關的連線指令碼)

4、ldflags += -bstatic -t $(ldscript) -ttext $(text_base) $(platform_ldflags)

$(text_base):text_base在board/smdk2410/config.mk中被定義為0x33f80000

$(platform_ldflags):platform_ldflags為空。

所以展開得:

此語句會在後面的u-boot.lds檔案分析中詳解

ldflags += -bstatic -t /board/smdk2410/u-boot.lds -ttext 0x33f80000

最終確定了u-boot在編譯時的連線方式。

至此頂層目錄下的config.mk檔案分析完畢。

再次分析makefile檔案

1、objs = cpu/arm920t/start.o(定義目標,它由cpu/arm920t/start.s編譯生成)

2、 libs = lib_generic/libgeneric.a

libs += board/smdk2410/libsmdk2410.a

libs += cpu/arm920t/libarm920t.a

libs += cpu/arm920t/s3c24x0/libs3c24x0.a

libs += lib_arm/libarm.a

libs += fs/cramfs/libcramfs.a fs/fat/libfat.a fs/fdos/libfdos.a fs/jffs2/libjffs2.a \

fs/reiserfs/libreiserfs.a fs/ext2/libext2fs.a

libs += net/libnet.a

libs += disk/libdisk.a

libs += rtc/librtc.a

libs += dtt/libdtt.a

libs += drivers/libdrivers.a

libs += drivers/nand/libnand.a

libs += drivers/nand_legacy/libnand_legacy.a

libs += drivers/sk98lin/libsk98lin.a

libs += post/libpost.a post/cpu/libcpu.a

libs += common/libcommon.a

定義庫檔案

3、$(objs):

$(make) -c cpu/arm920t $@ (指定objs的生成方式)

4、$(libs):

$(make) -c $(dir $(subst $(obj),,$@))

$(subdirs):

$(make) -c $@ all

指定庫檔案的生成方式

5、 $(obj)u-boot.srec: $(obj)u-boot

$(objcopy) $ -o srec $< $@

$(obj)u-boot.bin: $(obj)u-boot

$(objcopy) $ -o binary $< $@

$(obj)u-boot: depend version $(subdirs) $(objs) $(libs) $(ldscript)

undef_sym=`$(objdump) -x $(libs) |sed -n -e 's/.*\(__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`;\

cd $(lndir) && $(ld) $(ldflags) $$undef_sym $(__objs) \

--start-group $(__libs) --end-group $(platform_libs) \

-map u-boot.map -o u-boot

將生成的objs和libs連線生成elf格式的u-boot、u-boot.bin、u-boot.srec。

總結 :

1、首先生成cpu/arm920t/start.o檔案。

2、接著生成一些與平台、開發板相關的庫檔案*.a。

3、將以上得到的start.o檔案和*.a檔案通過連線方式:

ldflags += -bstatic -t /board/smdk2410/u-boot.lds -ttext 0x33f80000

最終生成u-boot.bin檔案。

U BOOT分析之編譯初體驗

嵌入式系統 uboot kernel 掛接根檔案系統 應用程式 1.u boot打補丁,編譯,結合makefile進行分析 a.解壓縮u boot壓縮包u boot 1.1.6.tar.bz2 tar xjf u boot 1.1.6.tar.bz2b.進入壓縮得到的檔案 cd u boot 1.1...

uboot配置編譯的巨集觀分析

在之前的博文中我從uboot的實際的工作流程方向介紹了uboot,在下面我將以市面上主流的s5pv210這款晶元為例,結合samsung官方為其移植的uboot,從其配置編譯的角度來分析uboot,講述uboot究竟是如何一步步生成最後的可執行映象檔案的。uboot 的配置過程主要涉及四個檔案 1 ...

uboot編譯體驗

bootloader的最終目的就是啟動核心。u boot 1.1.6.tar.bz2 是未經修改的原始碼,u boot 1.1.6 jz2440.patch 是補丁檔案。執行以下操作即可編譯出 u boot.bin tar xjf u boot 1.1.6.tar.bz2 cd u boot 1.1...