1. 程式人生 > >u-boot啟動之Makefile結構分析

u-boot啟動之Makefile結構分析

先進行配置命令:

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)