您的位置:首页 > 运维架构 > Linux

uboot系列之-----顶层Makefile分析(一)

2015-08-18 20:20 525 查看
ALL += $(obj)u-boot.srec $(obj)u-boot.bin$(obj)System.map $(U_BOOT_NAND) $(U_BOOT_ONENAND)

all:              $(ALL)

当用make命令编译时,执行的就是这个all变量

$(obj)u-boot.hex:         $(obj)u-boot

                   $(OBJCOPY)${OBJCFLAGS} -O ihex $< $@

Vuboot.hex是hex格式的文件。它的依赖u-boot属于ELF文件,OBJCOPY和OBJCFLAGS定义在顶层config.mk文件,

OBJCOPY = $(CROSS_COMPILE)objcopy ;objcopy命令的作用是将一种格式的文件拷贝成另外一种格式的文件。

OBJCFLAGS += --gap-fill=0xff;   --gap-fill = 0xff是objcopy的参数,表示在拷贝过程中,用0xff来填充段与段之间的空隙。

$<表示所有的依赖,即u-boot文件,$@表示所有的目标,即u-boot.hex

整句话的意思就是将u-boot拷贝成u-boot.hex 

 

$(obj)u-boot.srec:        $(obj)u-boot

                   $(OBJCOPY)-O srec $< $@

类似的,将u-boot拷贝成u-boot.srec文件

$(obj)u-boot.bin: $(obj)u-boot

                   $(OBJCOPY)${OBJCFLAGS} -O binary $< $@

                   $(BOARD_SIZE_CHECK)

ifeq ($(CONFIG_S5PC210),y)

                   ./mkbl2u-boot.bin bl2.bin 14336

Endif

将u-boot拷贝成u-boot.bin文件,同时执行$(BOARD_SIZE_CHECK),在Makefile前面部分,有如下语句定义了BOARD_SIZE_CHECK:

ifneq($(CONFIG_BOARD_SIZE_LIMIT),)

BOARD_SIZE_CHECK=\

         @actual='wc -d $@ |awk '{print $$!}';\

         limit=$(CONFIG_BOARD_SIZE_LIMIT);\

        if test

actual=gt
limit; then\

                 echo "$@ exceeds file size limit:";\

                 echo "limit:$$limit bytes";\

                echo "actual: $$actual bytes";\

                echo "excess:$$((actual-limit))bytes";\

                exit 1;\

        fi

else

BOARD_SIZE_CHECK =

Endif

首先看CONFIG_BOARD_SIZE_LIMIT是否被定义了(是否定义了,在autoconf.mk文件中查看,它的意思是规定了文件大小的上限),如果没定义,BOARD_SIZE_CHECK为空,如果定义了,就比较目标文件的实际大小与他的上限大小(CONFIG_BOARD_SIZE_LIMIT的值),如果前者大于后者,就退出,如前者小于后者,则继续执行。

接着分析上面蓝色字体的部分

如果在autoconf.mk中定义了CONFIG_S5PC210
= y,则执行mkbl2命令,这个命令是干嘛的呢?目前还不清楚

$(obj)u-boot.ldr: $(obj)u-boot  

               $(CREATE_LDR_ENV)

               $(LDR)-T $(CONFIG_BFIN_CPU)-c $@ $<$(LDR_FLAGS)

               $(BOARD_SIZE_CHECK)

生成u-boot.ldr文件

 

$(obj)u-boot.ldr.hex:  $(obj)u-boot.ldr 

                   $(OBJCOPY)${OBJCFLAGS}-O ihex $<$@ -I binary

                  

$(obj)u-boot.ldr.srec: $(obj)u-boot.ldr 

                    $(OBJCOPY)${OBJCFLAGS} -O srec $< $@ -I binary

生成u-boot.ldr.hex和u-boot.ldr.sec文件

$(obj)u-boot.img:         $(obj)u-boot.bin

                   $(obj)tools/mkimage -A $(ARCH) -T firmware -C none\

                  -a$(CONFIG_SYS_TEXT_BASE) -e 0\

                  -n$(shell sed -n -e 's/.*U_BOOT_VERSION//p'$(VERSION_FILE)|\

                          sed -e 's/''[]*$$/for $(BOARD)board''/' )\

                  -d$<$@

                  

Mkimage是给u-boot.bin增加0x40个字节大小的头部信息的工具,其各个参数的意义如下:

  -A 所支持的体系架构,这里是arm

  -T  镜像类型

  -C none  不压缩

  -a  指定映像在内存中的加载地址,映像下载到内存中的时候,要按照这个参数来加载

  -e   指定映像运行的入口地址

  -n   指定映像名称

  -d   指定生成映像的源文件

$(obj)u-boot.imx:     $(obj)u-boot.bin 

                   $(obj)tools/mkimage -n $(IMX_CONFIG) -T imximage\

                   -e $(CONFIG_SYS_TEXT_BASE) -d $<$@

$(obj)u-boot.kwb:      $(obj)u-boot.bin

                   $(obj)tools/mkimage -n $(CONFIG_SYS_KWD_CONFIG) -T kwbimage\

                   -a $(CONFIG_SYS_TEXT_BASE) -e $(CONFIG_SYS_TEXT_BASE) -d $<$@

类似于上面

$(obj)u-boot.dis:$(obj)u-boot

                   $(OBJDUMP) -d $< > $@

通过u-boot文件生成u-boot.dis  (u-boot.dis是u-boot的反汇编代码)

GEN_UBOOT = \

                  UNDEF_SYS='$(OBJDUMP) -x $(LIBBOARD) $(LIBS)|\

                 sed -n -e 's/.*SYM_PREFIX)__u_boot_cmd_.*/-u\1/p'sprt|uniq;\

                 cd $(LDR) && $(LD) $(LDFLAGS) $$UNDEF_SYM $(__OBJS)\

                     --start-group $(__LIBS) --end-group $(P;ATFORM_LIBS)

                        -Map u-boot.map -o u-boot

                  

由连接工具生成u-boot文件,并生成映射文件u-boot.map,具体的细节我也没看很懂

 

$(obj)u-boot: depend\

                  $(SUBDIRS) $(OBJS) $(LIBBOARD) $(LIBS) $(LDSCRIPT) $(obj)u-boot.lds

                  $(GEN_UBOOT)

这个是ELF格式的u-boot文件生成规则,后面那些变量都是它的依赖

先看depend

depend dep:     $(TIMESTAMP_FILE) $(VERSION_FILE) \ 

                    $(obj)include/autoconf.mk\

                    $(obj)include/generated/generic -asm-foosets.h

                   for dir in $(SUBDIRS) $(CPUDIR) $(dir $(LDSCRIPT));do\

                               $(MAKE) -C $$ dir _depend;done

依次进入到$(SUBDIRS)$(CPUDIR)和$(dir
$(LDSCRIPT))目录,执行make _depend命令。_depend定义在顶层目录的rules.mk文件中,总的说来,依赖depend就是在相关的目录下生成.depend文件,.depend文件的内容列出了每个目标文件的依赖文件

 

 

UBOOT的Makefile至此就大致分析完了,可能还有些地方说的不是很明白,望大家指正,接下来就要分析源码了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  uboot llinux