uboot_2009.08编译过程for2440

 

U-Boot is intended to be simple to build. After installing the
sources you must configure U-Boot for one specific board type. This
is done by typing:

                    make NAME_config

Finally, type "make all", and you should get some working U-Boot
images ready for download to / installation on your system

     上面两段文字来之于 uboot下readme,从上面可以得知,编译Uboot之前必须先要配置,执行命令: make NAME_config(name 定义)。

  遍历makefile中找到 

                                   smdk2440_config : unconfig
                                                       @$(MKCONFIG) $(@:_config=) arm arm920t smdk2440 samsung s3c24x0

执行make smdk2440_config 执行先执行 unconfig,删除上次配置文件。

493行

#########################################################################

unconfig:
 @rm -f $(obj)include/config.h $(obj)include/config.mk \
  $(obj)board/*/config.tmp $(obj)board/*/*/config.tmp \
  $(obj)include/autoconf.mk $(obj)include/autoconf.mk.dep

#########################################################################

我们可以替换变量中的共有的部分,其格式是“$(var:a=b)”或是“${var:a=b}”,其意思是,把变量“var”中所
有以“a”字串“结尾”的“a”替换成“b”字串。这里的“结尾”意思是“空格”或是“结束符”。

然后   @$(MKCONFIG) $(@:_config=) arm arm920t smdk2440 samsung s3c24x0向顶层文件下mkconfig脚本文件传递5个参数:

                              smdk2440   arm           arm920t               smdk2440               samsung                 s3c24x0

                               配置后,执行make all

再次编译makefile,找到all

294行:

# Always append ALL so that arch config.mk's can add custom ones
ALL += $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map $(U_BOOT_NAND) $(U_BOOT_ONENAND)

all:  $(ALL)

 这里看到了我们最终要得到u-boot.bin文件

305行

$(obj)u-boot.bin: $(obj)u-boot
  $(OBJCOPY) ${OBJCFLAGS} -O binary $< $@

 

$<
    依赖目标中的第一个目标名字。如果依赖目标是以模式(即"%")定义的,那么"$<"将是符合模式的一系列的文件
集。注意,其是一个一个取出来的。

$@
    表示规则中的目标文件集。在模式规则中,如果有多个目标,那么,"$@"就是匹配于目标中模式定义的集合。

OBJCOPY = $(CROSS_COMPILE)objcopy

OBJCFLAGS += --gap-fill=0xff(参数)

GNU实用工具程序 objcopy的作用是拷贝一个目标文件的内容到另一个目标文件中。 Objcopy使用GNU BFD库去读或写目标文件。 Objcopy可以使用不同于源目标文件的格式来写目的目标文件(也即是说可以将一种格式的目标文件转换成另一种格式的目标文件)。通过以上命令行选项可以控制 Objcopy的具体操作。
Objcopy在进行目标文件的转换时,将生成一个临时文件,转换完成后就将这个临时文件删掉。 Objcopy使用BFD做转换工作。如果没有明确地格式要求,则 Objcopy将访问所有在BFD库中已经描述了的并且它可以识别的格式,请参见《GNUpro Decelopment Tools》中“using ld”一章中“BFD库”部分和“BFD库中规范的目标文件格式”部分。
通过使用srec作为输出目标(使用命令行选项-o srec), Objcopy可以产生S记录格式文件。
通过使用binary作为输出目标(使用命令行选项-o binary), Objcopy可以产生原始的二进制文件。使用 Objcopy产生一个原始的二进制文件,实质上是进行了一回输入目标文件内容的内存转储。所有的符号和重定位信息都将被丢弃。内存转储起始于输入目标文件中那些将要拷贝到输出目标文件去的部分的最小虚地址处。
使用 Objcopy生成S记录格式文件或者原始的二进制文件的过程中,-S选项和-R选项可能会比较有用。-S选项是用来删掉包含调试信息的部分,-R选项是用来删掉包含了二进制文件不需要的内容的那些部分。(转载于 http://yuxu9710108.blog.163.com/blog/static/2375153420082422640901/

337行:

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

ifeq ($(CONFIG_KALLSYMS),y)
  smap=`$(call SYSTEM_MAP,u-boot) | \
   awk '$$2 ~ /[tTwW]/ {printf $$1 $$3 "\\\\000"}'` ; \
  $(CC) $(CFLAGS) -DSYSTEM_MAP="\"$${smap}\"" \
   -c common/system_map.c -o $(obj)common/system_map.o
  $(GEN_UBOOT) $(obj)common/system_map.o
endif

$(OBJS): depend
  $(MAKE) -C cpu/$(CPU) $(if $(REMOTE_BUILD),$@,$(notdir $@))

$(LIBS): depend $(SUBDIRS)
  $(MAKE) -C $(dir $(subst $(obj),,$@))

$(LIBBOARD): depend $(LIBS)
  $(MAKE) -C $(dir $(subst $(obj),,$@))

$(SUBDIRS): depend
  $(MAKE) -C $@ all

$(LDSCRIPT): depend
  $(MAKE) -C $(dir $@) $(notdir $@)

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

$(NAND_SPL): $(TIMESTAMP_FILE) $(VERSION_FILE) $(obj)include/autoconf.mk
  $(MAKE) -C nand_spl/board/$(BOARDDIR) all

$(U_BOOT_NAND): $(NAND_SPL) $(obj)u-boot.bin
  cat $(obj)nand_spl/u-boot-spl-16k.bin $(obj)u-boot.bin > $(obj)u-boot-nand.bin

$(ONENAND_IPL): $(TIMESTAMP_FILE) $(VERSION_FILE) $(obj)include/autoconf.mk
  $(MAKE) -C onenand_ipl/board/$(BOARDDIR) all

$(U_BOOT_ONENAND): $(ONENAND_IPL) $(obj)u-boot.bin
  cat $(obj)onenand_ipl/onenand-ipl-2k.bin $(obj)u-boot.bin > $(obj)u-boot-onenand.bin
  cat $(obj)onenand_ipl/onenand-ipl-4k.bin $(obj)u-boot.bin > $(obj)u-boot-flexonenand.bin

$(VERSION_FILE):
  @( printf '#define U_BOOT_VERSION "U-Boot %s%s"\n' "$(U_BOOT_VERSION)" \
   '$(shell $(TOPDIR)/tools/setlocalversion $(TOPDIR))' ) > $@.tmp
  @cmp -s $@ $@.tmp && rm -f $@.tmp || mv -f $@.tmp $@

$(TIMESTAMP_FILE):
  @date +'#define U_BOOT_DATE "%b %d %C%y"' > $@
  @date +'#define U_BOOT_TIME "%T"' >> $@

gdbtools:
  $(MAKE) -C tools/gdb all || exit 1

updater:
  $(MAKE) -C tools/updater all || exit 1

env:
  $(MAKE) -C tools/env all MTD_VERSION=${MTD_VERSION} || exit 1

depend dep: $(TIMESTAMP_FILE) $(VERSION_FILE) $(obj)include/autoconf.mk
  for dir in $(SUBDIRS) ; do $(MAKE) -C $$dir _depend ; done

TAG_SUBDIRS += include
TAG_SUBDIRS += lib_generic board/$(BOARDDIR)
TAG_SUBDIRS += cpu/$(CPU)
TAG_SUBDIRS += lib_$(ARCH)
TAG_SUBDIRS += fs/cramfs
TAG_SUBDIRS += fs/fat
TAG_SUBDIRS += fs/fdos
TAG_SUBDIRS += fs/jffs2
TAG_SUBDIRS += fs/yaffs2
TAG_SUBDIRS += net
TAG_SUBDIRS += disk
TAG_SUBDIRS += common
TAG_SUBDIRS += drivers/bios_emulator
TAG_SUBDIRS += drivers/block
TAG_SUBDIRS += drivers/gpio
TAG_SUBDIRS += drivers/hwmon
TAG_SUBDIRS += drivers/i2c
TAG_SUBDIRS += drivers/input
TAG_SUBDIRS += drivers/misc
TAG_SUBDIRS += drivers/mmc
TAG_SUBDIRS += drivers/mtd
TAG_SUBDIRS += drivers/mtd/nand
TAG_SUBDIRS += drivers/mtd/onenand
TAG_SUBDIRS += drivers/mtd/spi
TAG_SUBDIRS += drivers/net
TAG_SUBDIRS += drivers/net/sk98lin
TAG_SUBDIRS += drivers/pci
TAG_SUBDIRS += drivers/pcmcia
TAG_SUBDIRS += drivers/qe
TAG_SUBDIRS += drivers/rtc
TAG_SUBDIRS += drivers/serial
TAG_SUBDIRS += drivers/spi
TAG_SUBDIRS += drivers/usb
TAG_SUBDIRS += drivers/video

tags ctags:
  ctags -w -o $(obj)ctags `find $(SUBDIRS) $(TAG_SUBDIRS) \
      -name '*.[ch]' -print`

etags:
  etags -a -o $(obj)etags `find $(SUBDIRS) $(TAG_SUBDIRS) \
      -name '*.[ch]' -print`
cscope:
  find $(SUBDIRS) $(TAG_SUBDIRS) -name '*.[ch]' -print \
      > cscope.files
  cscope -b -q -k

SYSTEM_MAP = \
  $(NM) $1 | \
  grep -v '\(compiled\)\|\(\.o$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' | \
  LC_ALL=C sort
$(obj)System.map: $(obj)u-boot
  @$(call SYSTEM_MAP,$<) > $(obj)System.map

这后面这里就是最后把所有的所要依赖的东西整合在一起了,最终生成了uboot.bin文件

 

总结:首先执行配置命令:

make NAME_config    :清除上次配置文件然后向脚本文件mkconfig中传递了6个参数,至于脚本文件做了什么具体后面说;

然后执行:

make all:生成uboot.bin文件。。。。。。。。。。。。。。后面详谈。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值