分析程序的结构,分析它是如何链接的,最好的分析方法就是分析它的Makefile
make 100ask24x0_config 相当于执行:
100ask24x0_config:unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t 100ask24x0 NULL s3c24x0
MKCONFIG:= $(SRCTREE)/mkconfig
SRCTREE:soure tree 所以以上的指令的意思是在源文件目录下有个mkconfig这个文件
查看下
book@book-desktop:/work/mini2440_system$ cd u-boot-1.1.6/
book@book-desktop:/work/mini2440_system/u-boot-1.1.6$ ls mkconfig
mkconfig //确实有这个文件
所以@$(MKCONFIG)这句话就变成:mkconfig
$@:表示目标文件100ask24x0_config
_config= 被100ask24x0 替换
所以相当于执行
mkconfig 100ask24x0 arm arm920t 100ask24x0 NULL s3c24x0
在Makefile中:
# 这个是ELF格式的u-boot文件生成规则,后面那些变量都是它的依赖
$(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 /work/mini2440_system/u-boot-1.1.6 && arm-linux-ld -Bstatic -T /work/mini2440_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 /work/mini2440/gcc-3.4.5-glibc-2.3.6/bin/../lib/gcc/arm-linux/3.4.5 -lgcc \
-Map u-boot.map -o u-boot
0x33F80000 这个基地址是怎么来的呢?
book@book-desktop:/work/mini2440_system/u-boot-1.1.6$ grep "33f80000" * -nR
System.map:1:33f80000 t $a
System.map:2:33f80000 T _start
u-boot.map:168:.text 0x33f80000 0x247f8
u-boot.map:170: .text 0x33f80000 0x4a0 cpu/arm920t/start.o
u-boot.map:171: 0x33f80000 _start
u-boot.map:1195:Address of section .text set to 0x33f80000
要用大写的33F80000才正确
book@book-desktop:/work/mini2440_system/u-boot-1.1.6$ grep "33F80000" * -nR
board/mpl/vcma9/config.mk:24:TEXT_BASE = 0x33F80000
board/smdk2410/config.mk:25:TEXT_BASE = 0x33F80000
board/sbc2410x/config.mk:23:TEXT_BASE = 0x33F80000
board/100ask24x0/config.mk:25:TEXT_BASE = 0x33F80000 // 可以看出来 TEXT_BASE = 0x33F80000
u-boot.srec:2:S31533F80000170000EA14F09FE514F09FE514F09FE526
u-boot.srec:12195:S31533FAF9F0E4F9FA33F8000000626F6F746172677371
u-boot.srec:12400:S70533F80000CF
book@book-desktop:/work/mini2440_system/u-boot-1.1.6$
注意grep的用法:
格式:grep “查找的内容” * -nR
在顶层目录(\u-boot-1.1.6)的config.mk有这样一条指令:
config.mk:189:LDFLAGS += -Bstatic -T $(LDSCRIPT) -Ttext $(TEXT_BASE) $(PLATFORM_LDFLAGS)
这就是LDFLAGS的内容
SDRAM(64M)从0x30000000开始,最上方留512K存放u-boot,如果u-boot大于512K,可以使用TEXT_BASE = 0x33F80000
往下指到合适的地址
从分析编译过程可以得出以下信息:
1. 第一个执行文件:CPU/arm920t/start.S
2. 链接地址:由“board/100ask24x0/u-boot.lds” + 0x33F80000 合成