u-boot编译分析

来源:互联网 发布:老人去世无人知 编辑:程序博客网 时间:2024/05/16 19:50

在顶层目录下执行完"make smdk2410_config"命令后,就把u-boot给配置好了,接着就可以在执行"make all"或者"make"命令去编译u-boot了,完成后就可以烧写到开发板去运行了。(在Makefile中的all目标是第一个目标,因为Makefile将第一个目标设为默认目标,make命令后如果不加目标就默认是Makefile中的默认目标,所以执行"make all"命令是执行all目标,执行"make"其实也是执行all目标)。

分析顶层Makefile文件

1、include include/config.mk (包含在配置阶段建立的include/config.mk)
    export ARCH CPU BOARD VENDOR SOC (导入在配置阶段确定的变量)
export命令的作用:设置或显示环境变量。(比如我们要用一个命令,但这个命令的执行文件不在当前目录,这样我们每次用的时候必须指定执行文件的目录,麻烦,在代码中先执行export,这个相当于告诉程序,执行某某东西时,需要的文件或什么东东在这些目录里)。

在shell中执行程序时,shell会提供一组环境变量,export可新增,修改或删除环境变量,供后续执行的程序使用。
2、CROSS_COMPILE = arm-linux- (指定交叉编译工具)

3、include config.mk (包含在顶层目录下的config.mk文件)

分析顶层config.mk文件

1、BOARDDIR = smdk2410 (确定开发板目录为smdk2410)

2、sinclude board/smdk2410/config.mk (包含开发板相关的文件;sinclude代表如果没有该文件就停止编译,inuclude则不会停止)

3、LDSCRIPT := /board/smdk2410/u-boot.lds (包含开发板相关的连接脚本)

4、LDFLAGS += -Bstatic -T $(LDSCRIPT) -Ttext $(TEXT_BASE) $(PLATFORM_LDFLAGS)
    $(TEXT_BASE):TEXT_BASE在board/smdk2410/config.mk中被定义为0x33F80000
    $(PLATFORM_LDFLAGS):PLATFORM_LDFLAGS为空。
    所以展开得:

此语句会在后面的u-boot.lds文件分析中详解
    LDFLAGS += -Bstatic -T /board/smdk2410/u-boot.lds -Ttext 0x33F80000
最终确定了u-boot在编译时的连接方式。
至此顶层目录下的config.mk文件分析完毕。

再次分析Makefile文件

1、OBJS = cpu/arm920t/start.o (定义目标,它由cpu/arm920t/start.S编译生成)

2、 LIBS = lib_generic/libgeneric.a
LIBS += board/smdk2410/libsmdk2410.a
LIBS += cpu/arm920t/libarm920t.a
LIBS += cpu/arm920t/s3c24x0/libs3c24x0.a
LIBS += lib_arm/libarm.a
LIBS += fs/cramfs/libcramfs.a fs/fat/libfat.a fs/fdos/libfdos.a fs/jffs2/libjffs2.a \
fs/reiserfs/libreiserfs.a fs/ext2/libext2fs.a
LIBS += net/libnet.a
LIBS += disk/libdisk.a
LIBS += rtc/librtc.a
LIBS += dtt/libdtt.a
LIBS += drivers/libdrivers.a
LIBS += drivers/nand/libnand.a
LIBS += drivers/nand_legacy/libnand_legacy.a
LIBS += drivers/sk98lin/libsk98lin.a
LIBS += post/libpost.a post/cpu/libcpu.a
LIBS += common/libcommon.a
定义库文件

3、
$(OBJS):
$(MAKE) -C cpu/arm920t $@ (指定OBJS的生成方式)

4、$(LIBS):
        $(MAKE) -C $(dir $(subst $(obj),,$@))

   $(SUBDIRS):
        $(MAKE) -C $@ all
指定库文件的生成方式

5、 $(obj)u-boot.srec: $(obj)u-boot
        $(OBJCOPY) ${OBJCFLAGS} -O srec $< $@

     $(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
将生成的OBJS和LIBS连接生成elf格式的u-boot、u-boot.bin、u-boot.srec。

总结 :
1、首先生成cpu/arm920t/start.o文件。
2、接着生成一些与平台、开发板相关的库文件*.a。
3、将以上得到的start.o文件和*.a文件通过连接方式:

LDFLAGS += -Bstatic -T /board/smdk2410/u-boot.lds -Ttext 0x33F80000
最终生成u-boot.bin文件。

0 0
原创粉丝点击