u-boot编译连接分析

时间 :2016年4月3日09:24:04
地点 :宿舍。
功能 :u-boot编译连接阶段分析。(以smdk2410开发板为例)

在顶层目录下执行完"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 (导入在配置阶段确定的变量)

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为空。
    所以展开得:
    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文件。

 

转载于:https://www.cnblogs.com/zhouhaiyang/p/5349250.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值