您的位置:首页 > 其它

“第09课第2节 u-boot分析之Makefile结构分析”之学习笔记

2014-07-26 09:49 411 查看
分析程序的结构,分析它是如何链接的,最好的分析方法就是分析它的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 合成

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  arm