一. 分析 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来定义的.