一. 分析 uboot 的配置过程:
make 100ask24x0_config
查找:100ask24x0_config
100ask24x0_config : unconfig @$(MKCONFIG) $(@:_config=) arm arm920t 100ask24x0 NULL s3c24x0
查找:MKCONFIG
MKCONFIG := $(SRCTREE)/mkconfig
相当于:
mkconfig 100ask24x0 arm arm920t 100ask24x0 NULL s3c24x0
打开:mkconfig
# mkconfig 100ask24x0 arm arm920t 100ask24x0 NULL s3c24x0 # $0 $1 $2 $3 $4 $5 $6
替换各个参数:
# 生成链接文件: ln -s asm-$2 asm # ln -s asm-arm asm ln -s ${LNPREFIX}arch-$6 asm-$2/arch #ln -s arch-s3c24x0 asm-arm/arch ln -s ${LNPREFIX}proc-armv asm-$2/proc #ln -s proc-armv asm-arm/proc echo "ARCH = $2" > config.mk #生成config.mk echo "CPU = $3" >> config.mk #追加config.h echo "BOARD = $4" >> config.mk
相当于:
ARCH = arm CPU = arm920t BOARD = 100ask24x0 SOC = s3c24x0
生成 config.h 文件, 并写入下面内容
/* Automatically generated - do not edit */ #include <configs/100ask24x0.h>
二. 分析 uboot 编译过程:
make
查看makefile文件
一些obj
OBJS = cpu/$(CPU)/start.o # 相当于: OBJS = cpu/arm920t/start.o
一些lib
LIBS = lib_generic/libgeneric.a LIBS += board/$(BOARDDIR)/lib$(BOARD).a LIBS += cpu/$(CPU)/lib$(CPU).a #相当于: LIBS = lib_generic/libgeneric.a LIBS += board/100ask24x0/lib100ask24x0.a LIBS += cpu/arm920t/libarm920t.a ......
找到 u-boot.bin 发现它依赖于u-boot
$(obj)u-boot.bin: $(obj)u-boot $(OBJCOPY) ${OBJCFLAGS} -O binary $< $@ $(obj)u-boot: depend version $(SUBDIRS) $(OBJS) $(LIBS) $(LDSCRIPT) UNDEF_SYM=`$(OBJDUMP) -x $(LIBS) |sed -n -e 's/.*\(__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`;\ cd $(LNDIR) && $(LD) $(LDFLAGS) $$UNDEF_SYM $(__OBJS) \ --start-group $(__LIBS) --end-group $(PLATFORM_LIBS) \ -Map u-boot.map -o u-boot
简单的办法是重新运行一下make可以得到如下信息:
UNDEF_SYM=`arm-linux-objdump -x lib_generic/libgeneric.a board/100ask24x0/lib100ask24x0.a cpu/arm920t/libarm920t.a cpu/arm920t/s3c24x0/libs3c24x0.a lib_arm/libarm.a fs/cramfs/libcramfs.a fs/fat/libfat.a fs/fdos/libfdos.a fs/jffs2/libjffs2.a fs/reiserfs/libreiserfs.a
fs/ext2/libext2fs.a net/libnet.a disk/libdisk.a rtc/librtc.a dtt/libdtt.a drivers/libdrivers.a drivers/nand/libnand.a drivers/nand_legacy/libnand_legacy.a drivers/usb/libusb.a drivers/sk98lin/libsk98lin.a common/libcommon.a |sed -n -e 's/.*\(__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`;\
cd /home/s3c/workspace/system/u-boot-1.1.6 && arm-linux-ld -Bstatic -T /home/s3c/workspace/system/u-boot-1.1.6/board/100ask24x0/u-boot.lds -Ttext
0x33F80000 $UNDEF_SYM cpu/arm920t/start.o \
--start-group lib_generic/libgeneric.a board/100ask24x0/lib100ask24x0.a cpu/arm920t/libarm920t.a cpu/arm920t/s3c24x0/libs3c24x0.a lib_arm/libarm.a fs/cramfs/libcramfs.a fs/fat/libfat.a fs/fdos/libfdos.a fs/jffs2/libjffs2.a fs/reiserfs/libreiserfs.a
fs/ext2/libext2fs.a net/libnet.a disk/libdisk.a rtc/librtc.a dtt/libdtt.a drivers/libdrivers.a drivers/nand/libnand.a drivers/nand_legacy/libnand_legacy.a drivers/usb/libusb.a drivers/sk98lin/libsk98lin.a common/libcommon.a --end-group -L /home/s3c/workspace/tools/gcc-3.4.5-glibc-2.3.6/bin/../lib/gcc/arm-linux/3.4.5
-lgcc \
-Map u-boot.map -o u-boot
从中还可以发现:
链接文件是 board/100ask24x0/u-boot.lds
uboot的地址 0x33F80000
1. 分析这个链接文件
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") /*OUTPUT_FORMAT("elf32-arm", "elf32-arm", "elf32-arm")*/ OUTPUT_ARCH(arm) ENTRY(_start) SECTIONS { . = 0x00000000; . = ALIGN(4); .text : { cpu/arm920t/start.o (.text) board/100ask24x0/boot_init.o (.text) *(.text) } . = ALIGN(4); .rodata : { *(.rodata) } . = ALIGN(4); .data : { *(.data) } . = ALIGN(4); .got : { *(.got) } . = .; __u_boot_cmd_start = .; .u_boot_cmd : { *(.u_boot_cmd) } __u_boot_cmd_end = .; . = ALIGN(4); __bss_start = .; .bss : { *(.bss) } _end = .; }
从这个链接文件里我们可以得到:
第一个运行的文件 cpu\arm920t\start.s
2. 查找一下这个址:
grep "33F80000" * -nR
board/100ask24x0/config.mk:25:TEXT_BASE = 0x33F80000 board/smdk2410/config.mk:25:TEXT_BASE = 0x33F80000 board/mpl/vcma9/config.mk:24:TEXT_BASE = 0x33F80000 board/sbc2410x/config.mk:23:TEXT_BASE = 0x33F80000 u-boot.srec:2:S31533F80000170000EA14F09FE514F09FE514F09FE526 u-boot.srec:12195:S31533FAF9F0E4F9FA33F8000000626F6F746172677371 u-boot.srec:12400:S70533F80000CF
发现这个地址其实是由board/100ask24x0/config.mk来定义的.