在頂層目錄下執行完"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...