拿到新的 uboot後(uboot1.1.6),最開始進行 make xxx_config。然後再進行make。這裏面進行了什麼操作呢?
以三星的 s3c2410爲例。首先打開Makefile
發現其中:
$(shell [ -d ${BUILD_DIR} ] || mkdir -p ${BUILD_DIR}) //-d是判斷BUILD_DIR是否存在。倘若不存在就創建。mkdir的-p參數代表若路徑中的BUILD_DIR不存在就創建
BUILD_DIR := $(shell cd $(BUILD_DIR) && /bin/pwd) //嘗試進入BUILD_DIR 文件夾,如果能正常進入則將文件路勁賦值給BUILD_DIR 。
OBJTREE := $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR)) //如果BUILD_DIR不爲空,OBJTREE := $(BUILD_DIR)否則就是當前目錄$(CURDIR)
SRCTREE := $(CURDIR)
TOPDIR := $(SRCTREE)
LNDIR := $(OBJTREE)
export TOPDIR SRCTREE OBJTREE
MKCONFIG := $(SRCTREE)/mkconfig
export MKCONFIG
smdk2410_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0 //$(@:_config=) 去掉 _config
//此句話翻譯過來就是執行腳本
//mkconfig smdk2410 arm arm920t smdk2410 NULL s3c24x0
看下 mkconfig smdk2410 arm arm920t smdk2410 NULL s3c24x0 做了什麼?
ln -s ${LNPREFIX}arch-$3 asm-$2/arch //建立軟連接
echo "ARCH = $2" > config.mk
echo "CPU = $3" >> config.mk
echo "BOARD = $4" >> config.mk
//頭文件包含輸入到config.h
echo "#include <configs/$1.h>" >>config.h
打開include目錄下的config.mk
ARCH = arm
CPU = arm920t
BOARD = s3c2410
SOC = s3c24x0
打開include目錄下的 config.h
/* Automatically generated - do not edit */
#include <configs/smdk2410.h>
smdk2410.h類似於kernel的make menuconfig,只不過沒有圖形界面。打開smdk2410大概內容如下:
包含一些 sp,中斷棧,sdram大小,sdram基地址等等所有信息。
* Stack sizes
*
* The stack sizes are set up in start.S using the settings below
*/
#define CONFIG_STACKSIZE (128*1024) /* regular stack */
#ifdef CONFIG_USE_IRQ
#define CONFIG_STACKSIZE_IRQ (4*1024) /* IRQ stack */
#define CONFIG_STACKSIZE_FIQ (4*1024) /* FIQ stack */
#endif
/*-----------------------------------------------------------------------
* Physical Memory Map
*/
#define CONFIG_NR_DRAM_BANKS 1 /* we have 1 bank of DRAM */
#define PHYS_SDRAM_1 0x30000000 /* SDRAM Bank #1 */
#define PHYS_SDRAM_1_SIZE 0x04000000 /* 64 MB */
#define PHYS_FLASH_1 0x00000000 /* Flash Bank #1 */
#define CFG_FLASH_BASE PHYS_FLASH_1
#define CFG_MONITOR_BASE PHYS_FLASH_1
2.確定交叉工具鏈
include $(OBJTREE)/include/config.mk
export ARCH CPU BOARD VENDOR SOC //應用上述生成的inluude目錄下config.mk.輸出環境變量
CROSS_COMPILE = arm-linux- //編譯選項
export CROSS_COMPILE //導出編譯選項
3.添加objs和lib庫
OBJS = cpu/$(CPU)/start.o // cpu/arm920t/
#lib 庫
LIBS = lib_generic/libgeneric.a
LIBS += board/$(BOARDDIR)/lib$(BOARD).a
LIBS += cpu/$(CPU)/lib$(CPU).a
ifdef SOC
LIBS += cpu/$(CPU)/$(SOC)/lib$(SOC).a
endif
LIBS += lib_$(ARCH)/lib$(ARCH).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/usb/libusb.a
LIBS += drivers/sk98lin/libsk98lin.a
LIBS += common/libcommon.a
LIBS += $(BOARDLIBS)
4.查看依賴關係,編譯uboot.bin
all: $(ALL) //這個僞目標all是所有目標的目標,其功能一般是編譯所有的目標。
//這條編譯命令實現了ELF格式的U-Boot文件到BIN格式的轉換。
$(obj)u-boot.bin: $(obj)u-boot
$(OBJCOPY) ${OBJCFLAGS} -O binary $< $@
//展開arm-linux-objdump -d uboot > uboot.dis 反彙編
$(obj)u-boot.dis: $(obj)u-boot
$(OBJDUMP) -d $< > $@
//u-boot.bin依賴於$(obj)u-boot ,$(obj)u-boot 又依賴於depend version $(SUBDIRS) $(OBJS) $(LIBS) $(LDSCRIPT)
$(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