Chinaunix首页 | 论坛 | 博客
  • 博客访问: 27624
  • 博文数量: 6
  • 博客积分: 67
  • 博客等级: 民兵
  • 技术积分: 52
  • 用 户 组: 普通用户
  • 注册时间: 2012-09-18 16:52
文章分类

全部博文(6)

文章存档

2012年(6)

分类:

2012-09-19 08:40:13

原文地址:uboot Makefile 分析 作者:

应该说,uboot的Makefile还是比较简单的,虽然看起来很庞大,但是后面的大部分都是各类型board的config,真正生成u-boot.bin的部分较少。uboot的代码也是如此,代码很多,如果单一的看某个board,代码则不多。

 282 ALL += $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map $(U_BOOT_NAND) $(U_BOOT_ONENAND) $(obj)u-boot.dis
 283 ifeq ($(ARCH),blackfin)
 284 ALL += $(obj)u-boot.ldr
 285 endif
 286 
 287 all:        $(ALL)
 288 
 289 $(obj)u-boot.hex:   $(obj)u-boot
 290         $(OBJCOPY) ${OBJCFLAGS} -O ihex $< $@
 291 
 292 $(obj)u-boot.srec:  $(obj)u-boot
 293         $(OBJCOPY) ${OBJCFLAGS} -O srec $< $@
 294 
 295 $(obj)u-boot.bin:   $(obj)u-boot
 296         $(OBJCOPY) ${OBJCFLAGS} -O binary $< $@
 297 
 298 $(obj)u-boot.ldr:   $(obj)u-boot
 299         $(LDR) -T $(CONFIG_BFIN_CPU) -f -c $@ $< $(LDR_FLAGS)
 300 
 301 $(obj)u-boot.ldr.hex:   $(obj)u-boot.ldr
 302         $(OBJCOPY) ${OBJCFLAGS} -O ihex $< $@ -I binary
 303 
 304 $(obj)u-boot.ldr.srec:  $(obj)u-boot.ldr
 305         $(OBJCOPY) ${OBJCFLAGS} -O srec $< $@ -I binary
 306 
 307 $(obj)u-boot.img:   $(obj)u-boot.bin
 308         ./tools/mkimage -A $(ARCH) -T firmware -C none \
 309         -a $(TEXT_BASE) -e 0 \
 310         -n $(shell sed -n -e 's/.*U_BOOT_VERSION//p' $(VERSION_FILE) | \
 311             sed -e 's/"[     ]*$$/ for $(BOARD) board"/') \
 312         -d $< $@
 313 
 314 $(obj)u-boot.sha1:  $(obj)u-boot.bin
 315         $(obj)tools/ubsha1 $(obj)u-boot.bin
 316 
 317 $(obj)u-boot.dis:   $(obj)u-boot
 318         $(OBJDUMP) -d $< > $@
 319 
 320 $(obj)u-boot:       depend $(SUBDIRS) $(OBJS) $(LIBBOARD) $(LIBS) $(LDSCRIPT)
 321         UNDEF_SYM=`$(OBJDUMP) -x $(LIBBOARD) $(LIBS) | \
 322         sed  -n -e 's/.*\($(SYM_PREFIX)__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`;\
 323         cd $(LNDIR) && $(LD) $(LDFLAGS) $$UNDEF_SYM $(__OBJS) \
 324             --start-group $(__LIBS) --end-group $(PLATFORM_LIBS) \

上面列出来的代码就是最终生成各种object的规则,在此之前,Makefile配置了当前OS类型,目标ARCH,交叉编译器,目标目录等环境变量。
从这一段代码可以看出,u-boot是首先被生成的,使用$(LD)来链接各.a得到。u-boot是elf格式的文件,这个文件是不能直接下载到board上运行。三星的IROM只能识别纯粹的binary,即不包含地址重定位的binary。

u-boot.bin就是纯粹的binary格式,可以直接下载到board的SDRAM中,或者烧写到flash中。从Makefile可以看出,u-boot.bin使用OBJCOPY从u-boot中拷贝得到。从之前的elf格式分析知道,实际上就是将elf格式去头去尾,并将各segment填充合并。

其他格式的文件或map等不再详述,从Makefile可以看得很清楚。

2518 smdkc100_config :       unconfig
2519     @$(MKCONFIG) $(@:_config=) arm s5pc1xx smdkc100 samsung s5pc100
再接下来的board config部分,以smdkc100为例。我们执行make smdkc100_config,实际上就是执行了:
mkconfig smdkc100 arm s5pc1xx smdkc100 samsung s5pc100
mkconfig是一个脚本文件,其内容这里就不列出来了。他的工作就是根据输入参数,将cpu, board,include目录下的对应文件或子目录链接到顶层目录上来。
阅读(1113) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~