U-Boot Hacking 2
时间:2007-02-08 来源:jarodwang
书接上回,执行完毕了make smdk2410_config命令之后,接下来就可以使用make命令来编译U-Boot了,最终生成我们将要烧写到Flash中的二进制映像文件u-boot.bin。这里编译U-Boot我们直接使用了make命令,相当于执行的是Makefile中的all目标,下面就来看看这个all目标的执行流程。
第143行说明了all目标的依赖是ALL变量的内容:
[code]
all: $(ALL)
[/code]
之前的第141行对ALL变量进行了赋值:
[code]
ALL = u-boot.srec u-boot.bin System.map
[/code]
从而all目标的依赖实际上是u-boot.srec,u-boot.bin和System.map。由于我们最终需要的是u-boot.bin这个二进制映像文件,那么我们首先来看看u-boot.bin这个同名的依赖又是什么。
第151行和第152行的代码告诉我们u-boot.bin又依赖于u-boot:
[code]
u-boot.bin: u-boot
$(OBJCOPY) ${OBJCFLAGS} -O binary $< $@
[/code]
建立u-boot的规则出现在第164行到168行:
[code]
u-boot: depend $(SUBDIRS) $(OBJS) $(LIBS) $(LDSCRIPT)
UNDEF_SYM=`$(OBJDUMP) -x $(LIBS) |sed -n -e 's/.*\(__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`;\
$(LD) $(LDFLAGS) $$UNDEF_SYM $(OBJS) \
--start-group $(LIBS) --end-group $(PLATFORM_LIBS) \
-Map u-boot.map -o u-boot
[/code] 可以看到u-boot的依赖有depend,$(SUBDIRS),$(OBJS),$(LIBS),$(LDSCRIPT),接着一一分解。 depend在第179行: [code] depend dep: @for dir in $(SUBDIRS) ; do $(MAKE) -C $$dir .depend ; done [/code] $(SUBDIRS)在第173行: [code] $(SUBDIRS):
$(MAKE) -C $@ all [/code] 对$(OBJS)的赋值从第92行开始,可以看到它的具体内容是由$(CPU)变量的值决定的: [code] OBJS = cpu/$(CPU)/start.o
ifeq ($(CPU),i386)
OBJS += cpu/$(CPU)/start16.o
OBJS += cpu/$(CPU)/reset.o
endif
ifeq ($(CPU),ppc4xx)
OBJS += cpu/$(CPU)/resetvec.o
endif
ifeq ($(CPU),mpc83xx)
OBJS += cpu/$(CPU)/resetvec.o
endif
ifeq ($(CPU),mpc85xx)
OBJS += cpu/$(CPU)/resetvec.o
endif [/code] 对$(LIBS)的赋值从第107行开始,可以看到它的具体内容是由$(CPU)变量的值决定的: [code] 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/sk98lin/libsk98lin.a
LIBS += post/libpost.a post/cpu/libcpu.a
LIBS += common/libcommon.a
.PHONY : $(LIBS) [/code] 可以看到$(LIBS)变量的值都是和$(CPU),$(SOC)有关的以及通用的静态链接库。这些静态链接库的建立由第170行开始的目标来完成: [code] $(LIBS):
$(MAKE) -C `dirname $@` [/code]
第143行说明了all目标的依赖是ALL变量的内容:
[code]
all: $(ALL)
[/code]
之前的第141行对ALL变量进行了赋值:
[code]
ALL = u-boot.srec u-boot.bin System.map
[/code]
从而all目标的依赖实际上是u-boot.srec,u-boot.bin和System.map。由于我们最终需要的是u-boot.bin这个二进制映像文件,那么我们首先来看看u-boot.bin这个同名的依赖又是什么。
第151行和第152行的代码告诉我们u-boot.bin又依赖于u-boot:
[code]
u-boot.bin: u-boot
$(OBJCOPY) ${OBJCFLAGS} -O binary $< $@
[/code]
建立u-boot的规则出现在第164行到168行:
[code]
u-boot: depend $(SUBDIRS) $(OBJS) $(LIBS) $(LDSCRIPT)
UNDEF_SYM=`$(OBJDUMP) -x $(LIBS) |sed -n -e 's/.*\(__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`;\
$(LD) $(LDFLAGS) $$UNDEF_SYM $(OBJS) \
--start-group $(LIBS) --end-group $(PLATFORM_LIBS) \
-Map u-boot.map -o u-boot
[/code] 可以看到u-boot的依赖有depend,$(SUBDIRS),$(OBJS),$(LIBS),$(LDSCRIPT),接着一一分解。 depend在第179行: [code] depend dep: @for dir in $(SUBDIRS) ; do $(MAKE) -C $$dir .depend ; done [/code] $(SUBDIRS)在第173行: [code] $(SUBDIRS):
$(MAKE) -C $@ all [/code] 对$(OBJS)的赋值从第92行开始,可以看到它的具体内容是由$(CPU)变量的值决定的: [code] OBJS = cpu/$(CPU)/start.o
ifeq ($(CPU),i386)
OBJS += cpu/$(CPU)/start16.o
OBJS += cpu/$(CPU)/reset.o
endif
ifeq ($(CPU),ppc4xx)
OBJS += cpu/$(CPU)/resetvec.o
endif
ifeq ($(CPU),mpc83xx)
OBJS += cpu/$(CPU)/resetvec.o
endif
ifeq ($(CPU),mpc85xx)
OBJS += cpu/$(CPU)/resetvec.o
endif [/code] 对$(LIBS)的赋值从第107行开始,可以看到它的具体内容是由$(CPU)变量的值决定的: [code] 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/sk98lin/libsk98lin.a
LIBS += post/libpost.a post/cpu/libcpu.a
LIBS += common/libcommon.a
.PHONY : $(LIBS) [/code] 可以看到$(LIBS)变量的值都是和$(CPU),$(SOC)有关的以及通用的静态链接库。这些静态链接库的建立由第170行开始的目标来完成: [code] $(LIBS):
$(MAKE) -C `dirname $@` [/code]
相关阅读 更多 +