u-boot-2014.10编译u-boot

1. /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory

解决:yum install glibc.i686

2. 顶层Makefile会读取如下文件:

Reading makefile '/home/feng/work/projects/UBoot/scripts/Kbuild.include' (search path) (no ~ expansion)...
Reading makefile 'include/config/auto.conf' (search path) (don't care) (no ~ expansion)...
Reading makefile 'include/config/auto.conf.cmd' (search path) (don't care) (no ~ expansion)...
Reading makefile 'include/autoconf.mk' (search path) (don't care) (no ~ expansion)...
Reading makefile 'include/autoconf.mk.dep' (search path) (don't care) (no ~ expansion)...
Reading makefile '/home/feng/work/projects/UBoot/scripts/Makefile.extrawarn' (search path) (no ~ expansion)...

   其中include/config/auto.conf会被更新,更新后,Makefile会重启。

3. 顶层Makefile重启后,会编译如下目标:

第一级:

all:  $(ALL-y)  

//ALL-y=

checkarmreloc u-boot.srec u-boot.bin System.map binary_size_check u-boot.dtb u-boot-dtb.bin

第二级:

checkarmreloc: u-boot

u-boot.hex u-boot.srec: u-boot FORCE

u-boot.bin: u-boot FORCE

System.map: u-boot

binary_size_check: u-boot.bin FORCE

u-boot.dtb: dts/dt.dtb

u-boot-dtb.bin: u-boot.bin dts/dt.dtb FORCE

dtbs dts/dt.dtb: checkdtc u-boot

第三级:

u-boot:$(u-boot-init) $(u-boot-main) u-boot.lds 

//u-boot-init=arch/arm/cpu/armv7/start.o

//u-boot-main= 

arch/arm/cpu/built-in.o arch/arm/cpu/armv7/built-in.o arch/arm/cpu/armv7/exynos/built-in.o arch/arm/lib/built-in.o board/samsung/common/built-in.o board/samsung/smdkv310/built-in.o common/built-in.o disk/built-in.o drivers/built-in.o drivers/dma/built-in.o drivers/gpio/built-in.o drivers/i2c/built-in.o drivers/mmc/built-in.o drivers/mtd/built-in.o drivers/mtd/onenand/built-in.o drivers/mtd/spi/built-in.o drivers/net/built-in.o drivers/net/phy/built-in.o drivers/pci/built-in.o drivers/power/built-in.o drivers/power/battery/built-in.o drivers/power/fuel_gauge/built-in.o drivers/power/mfd/built-in.o drivers/power/pmic/built-in.o drivers/serial/built-in.o drivers/spi/built-in.o drivers/usb/eth/built-in.o drivers/usb/gadget/built-in.o drivers/usb/host/built-in.o drivers/usb/musb-new/built-in.o drivers/usb/musb/built-in.o drivers/usb/phy/built-in.o drivers/usb/ulpi/built-in.o fs/built-in.o lib/built-in.o lib/libfdt/built-in.o net/built-in.o test/built-in.o test/dm/built-in.o

checkdtc:

第四级:

$(sort $(u-boot-init) $(u-boot-main)): $(u-boot-dirs) 

//u-boot-dirs=

arch/arm/cpu arch/arm/cpu/armv7 arch/arm/cpu/armv7/exynos arch/arm/lib board/samsung/common board/samsung/smdkv310 common disk drivers drivers/dma drivers/gpio drivers/i2c drivers/mmc drivers/mtd drivers/mtd/onenand drivers/mtd/spi drivers/net drivers/net/phy drivers/pci drivers/power drivers/power/battery drivers/power/fuel_gauge drivers/power/mfd drivers/power/pmic drivers/serial drivers/spi drivers/usb/eth drivers/usb/gadget drivers/usb/host drivers/usb/musb-new drivers/usb/musb drivers/usb/phy drivers/usb/ulpi fs lib lib/libfdt net test test/dm tools examples

u-boot.lds: $(LDSCRIPT) prepare FORCE

//LDSCRIPT=/home/feng/work/projects/UBoot/arch/arm/cpu/u-boot.lds

第五级:

$(u-boot-dirs): prepare scripts

$(filter-out tools, $(u-boot-dirs)): tools

tools: prepare

prepare: prepare0

prepare0: archprepare FORCE

archprepare: prepare1 scripts_basic

prepare1: prepare2 $(version_h) $(timestamp_h) include/config/auto.conf

//version_h=include/generated/version_autogenerated.h

//timestamp_h=include/generated/timestamp_autogenerated.h

prepare2: prepare3 outputmakefile

prepare3: include/config/uboot.release

第六级:

scripts: ;

$(version_h): include/config/uboot.release FORCE

$(timestamp_h): $(srctree)/Makefile FORCE

include/config/uboot.release: include/config/auto.conf FORCE

include/config/%.conf: $(KCONFIG_CONFIG) include/config/auto.conf.cmd

//KCONFIG_CONFIG=.config

3. 具体的编译过程

  • 根据include/config/%.conf的规则,调用:

make -f /home/feng/work/projects/UBoot/Makefile silentoldconfig。

根据silentoldconfig的规则,调用:

/bin/sh /home/feng/work/projects/UBoot/scripts/multiconfig.sh silentoldconfig。

multiconfig.sh -->

do_silentoldconfig --> 

run_make_config silentoldconfig &

autoconf include include/autoconf.mk include/autoconf.mk.dep。 

run_make_config 会用Makefile.build 编译目标,在创建silentoldconfig过程中,会创建include/config和include/generated两个目录,并会调用conf进行处理,命令为:

scripts/kconfig/conf --silentoldconfig Kconfig

autoconf会使用Makefile.autoconf编译include/autoconf.mk和include/autoconf.mk.dep。

至此include/config/auto.conf编译完成。include/config/auto.conf更新后,顶层Makefile会重启,重启后,上述的过程还会重复,只是不会更新任何文件了。

  • 编译include/config/uboot.release --> prepare3 --> prepare2 --> prepare1 --> archprepare -->prepare0,编译prepare0时,make命令为:make -f scripts/Makefile.build obj=.。也就是编译顶层目录,Kbuild优先于Makefile,所以使用Kbuild进行编译,目标为:include/generated/generic-asm-offsets.h和include/generated/asm-offsets.h
  • 编译tools,目标为:tools/gen_eth_addr tools/img2srec tools/mkenvimage tools/dumpimage tools/mkimage tools/proftool
  • 编译u-boot-dirs中的所有目录。这个过程本身没什么好说的。但是在编译过程中,会看到许多:

Considering target file 'test/dm/built-in.o'.

...

Pruning file 'arch/arm/cpu'

...

Prerequisite 'arch/arm/cpu' of target 'test/dm/built-in.o' does not exist.

...

Must remake target 'test/dm/built-in.o'.
Successfully remade target file 'test/dm/built-in.o'.

这是因为规则$(sort $(u-boot-init) $(u-boot-main)): $(u-boot-dirs) 。例如,'test/dm/built-in.o属于u-boot-main,依据该规则,它依赖于u-boot-dirs,因此所有属于u-boot-dirs的目录都会被Pruning,并且提示目录不存在(因为u-boot-dirs定义为伪目标)。注意该规则是没有实际的命令,在这种情况下,make会忽略依赖文件不存在的实际情况,运行分号(;)代表的空语句,并认为目标编译成功。而目标test/dm/built-in.o其实在编译u-boot-dirs的时候已经编译成功了。

  • 编译dts/dt.dtb比较麻烦,还会进入到arch目录,这之后的编译都相对简单。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值