u-boot啟動之Makefile結構分析
阿新 • • 發佈:2018-12-21
先進行配置命令:
make smdk2410_config
在Makefile檔案中:
smdk2410_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0
因此mkconfig檔案中會傳入如下引數:
#Parameters: Target Architecture CPU Board [VENDOR] [SOC]
mkconfig smdk2410 arm arm920t smdk2410 NULL s3c24x0
$0 $1 $2 $3 $4 $5 $6
配置命令過後,mkconfig建立了一些連結檔案,在include目錄下新建了一個config.mk檔案,其內容是:
ARCH = arm
CPU = arm920t
BOARD = smdk2410
SOC = s3c24x0
在include/configs目錄下新建了一個開發板相關的標頭檔案smdk2410.h,內容是:
/* Automatically generated - do not edit */
#include <configs/smdk2410.h>"
編譯命令:
make
分析頂層Makefile:
# load ARCH, BOARD, and CPU configuration
include $(OBJTREE)/include/config.mk
export ARCH CPU BOARD VENDOR SOC
...
ifeq ($(ARCH),arm) /* ARCH = arm */
CROSS_COMPILE = arm-linux-
endif
...
OBJS = cpu/$(CPU)/start.o /* CPU = arm920t */
...
LIBS = lib_generic/libgeneric.a
LIBS += board/$(BOARDDIR)/lib$(BOARD) .a /* BOARD = smdk2410 */
LIBS += cpu/$(CPU)/lib$(CPU).a /* CPU = arm920t */
...
ALL = $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map $(U_BOOT_NAND)
all: $(ALL)
...
$(obj)u-boot.bin: $(obj)u-boot /* 該u-boot為elf格式,u-boot.bin是二進位制格式 */
$(OBJCOPY) ${OBJCFLAGS} -O binary $< [email protected]
...
$(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
執行make命令,得到:
UNDEF_SYM=`arm-linux-objdump -x lib_generic/libgeneric.a board/100ask24x0/lib100ask24x0.a cpu/arm920t/libarm920t.a cpu/arm920t/s3c24x0/libs3c24x0.a lib_arm/libarm.a fs/cramfs/libcramfs.a fs/fat/libfat.a fs/fdos/libfdos.a fs/jffs2/libjffs2.a fs/reiserfs/libreiserfs.a fs/ext2/libext2fs.a net/libnet.a disk/libdisk.a rtc/librtc.a dtt/libdtt.a drivers/libdrivers.a drivers/nand/libnand.a drivers/nand_legacy/libnand_legacy.a drivers/usb/libusb.a drivers/sk98lin/libsk98lin.a common/libcommon.a |sed -n -e 's/.*\(__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`;\
cd /work/system/u-boot-1.1.6 &&
arm-linux-ld -Bstatic -T /work/system/u-boot-1.1.6/board/100ask24x0/u-boot.lds -Ttext 0x33F80000 $UNDEF_SYM cpu/arm920t/start.o \
--start-group lib_generic/libgeneric.a board/100ask24x0/lib100ask24x0.a cpu/arm920t/libarm920t.a cpu/arm920t/s3c24x0/libs3c24x0.a lib_arm/libarm.a fs/cramfs/libcramfs.a fs/fat/libfat.a fs/fdos/libfdos.a fs/jffs2/libjffs2.a fs/reiserfs/libreiserfs.a fs/ext2/libext2fs.a net/libnet.a disk/libdisk.a rtc/librtc.a dtt/libdtt.a drivers/libdrivers.a drivers/nand/libnand.a drivers/nand_legacy/libnand_legacy.a drivers/usb/libusb.a drivers/sk98lin/libsk98lin.a common/libcommon.a --end-group -L /usr/local/arm/4.3.2/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.2/armv4t -lgcc \
-Map u-boot.map -o u-boot
由Makefile得知: a.第一個檔案:cpu/arm920t/start.S; b.連結地址:board/smdk2410/u-boot.lds與0x33f80000 0x33f80000是在boards/smdk2410/config.mk檔案中定義的
TEXT_BASE = 0x33F80000 /* 若要改變u-boot放的位置,可以改這個地址 */
而該LDFLAGS在頂層目錄的config.mk中定義:
config.mk:189:LDFLAGS += -Bstatic -T $(LDSCRIPT) -Ttext $(TEXT_BASE) $(PLATFORM_LDFLAGS)