首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 系统运维 >

GNU ARM汇编-(十七)u-boot的makefile跟mkconfig解读

2012-11-09 
GNU ARM汇编--(十七)u-boot的makefile和mkconfig解读自己写的bootloader可以引导kernel了,我以为曾经神秘

GNU ARM汇编--(十七)u-boot的makefile和mkconfig解读

        自己写的bootloader可以引导kernel了,我以为曾经神秘的u-boot代码将变得毫无挑战,然事实表明u-boot作为优秀的开源代码,阅读起来还是很有挑战的,值得一读!

        阅读碰到的头等问题:Makefile和shell脚本看不懂...

        说起来做linux也很久了,Makefile和shell脚本都接触过,但真的都是略懂而已.因为公司的Makefile和shell简单的一眼望的对穿,很初级的写法,简单的应用.再随便在网上下个老外的开源代码,那个Makefile和shell复杂啊.一不留神想起来了qt的qmake根据工程文件生成的Makefile也是很简单,但qmake是人家老外写的.不说其他语言了,只看Makefile和shell,中外的差距就在那了.

        这次准备移植u-boot到tq2440上,选用的u-boot版本是u-boot-2012.07.

        下面是我对u-boot配置和编译的makefile mkconfig config.mk等文件的解读,有些解读我是在源档上添加文字注释的,有些是另外写的,解读难免有误,若有读者发现了,希望能够指出,在下感激不尽!

        在编译u-boot的过程,就是make xxx_config和make两步

        以make smdk2410_config为例:

        当以smdk2410_config为目标时,makefile中前面一些变量的定义和其他文件的引用也是有的,这个在原档中添加了有关注释:

        在makefile中有:

        

$(obj)u-boot.bin:$(obj)u-boot$(OBJCOPY) ${OBJCFLAGS} -O binary $< $@$(BOARD_SIZE_CHECK)####################################################################################要得到最后的u-boot.bin,必须得到u-boot.u-boot.bin是最后要烧写到板子上的二进制bin档#利用objcopy来得到这个二进制文件($@是规则的目标文件名,$<是规则的第一个依赖文件名)#调用BOARD_SIZE_CHECK###################################################################################

u-boot的依赖分析:
$(obj)u-boot: depend \
$(SUBDIR_TOOLS) $(OBJS) $(LIBBOARD) $(LIBS) $(LDSCRIPT) $(obj)u-boot.lds
$(GEN_UBOOT)


u-boot 依赖depend $(SUBDIR_TOOLS) $(OBJS) $(LIBBOARD) $(LIBS) $(LDSCRIPT) $(obj)u-boot.lds
然后用$(GEN_UBOOT)生成最后的u-boot,GEN_UBOOT就是用ld链接的过程


a.看一下depend:
depend dep: $(TIMESTAMP_FILE) $(VERSION_FILE) \
$(obj)include/autoconf.mk \
$(obj)include/generated/generic-asm-offsets.h \
$(obj)include/generated/asm-offsets.h
for dir in $(SUBDIRS) $(CPUDIR) $(LDSCRIPT_MAKEFILE_DIR) ; do \
$(MAKE) -C $$dir _depend ; done
对$(SUBDIRS) $(CPUDIR) $(LDSCRIPT_MAKEFILE_DIR)目录生成depend依赖文件;
而_depend是在rules.mk中定义的,利用CC的-M选项生成依赖文件.

b.看一下$(SUBDIR_TOOLS):
         tools目录

c.看一下$(OBJS):
$(OBJS): depend
$(MAKE) -C $(CPUDIR) $(if $(REMOTE_BUILD),$@,$(notdir $@))
看下$(if $(REMOTE_BUILD),$@,$(notdir $@))
因为$(REMOTE_BUILD)为空,所以返回的是$(notdir $@)的值;
因为$@指的是规则的目标,所以就是$(OBJS),而$(OBJS)就是arch/arm/cpu/arm920t/start.o
notdir内嵌函数返回的文件名;所以返回start.o
执行makc -C arch/arm/cpu/arm920t start.o

d.$(LIBBOARD)
$(LIBBOARD): depend $(LIBS)
$(MAKE) -C $(dir $(subst $(obj),,$@))
执行make -C board/samsung/smdk2410

e.$(LIBS)
$(LIBS): depend $(SUBDIR_TOOLS)
$(MAKE) -C $(dir $(subst $(obj),,$@))
进入到LIBS包含的很多目录,执行make,生成很多.a文件.

f.$(LDSCRIPT)
$(LDSCRIPT): depend
$(MAKE) -C $(dir $@) $(notdir $@)
在前面找链接脚本时已然知晓LDSCRIPT就是arch/arm/cpu/u-boot.lds
执行make -C arch/arm/cpu u-boot.lds  这个目录没有makefile,这什么意思?!!!

g.$(obj)u-boot.lds
$(obj)u-boot.lds: $(LDSCRIPT)
$(CPP) $(CPPFLAGS) $(LDPPFLAGS) -ansi -D__ASSEMBLY__ -P - <$^ >$@

       这些就是编译uboot的规则,分析的比较粗糙,在移植的过程中肯定还会遇到各式各样的问题,在移植过程中再进一步深入并修正.

        


热点排行