1. /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory
解决:yum install glibc.i686
2. 顶层Makefile会读取如下文件:
其中include/config/auto.conf会被更新,更新后,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)...
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
3. 具体的编译过程//KCONFIG_CONFIG=.config
- 根据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目录,这之后的编译都相对简单。