时间 :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

u-boot编译连接分析相关推荐

  1. 高通Android智能平台环境搭建_编译流程分析

    高通Android智能平台环境搭建_编译流程分析 高通平台环境搭建,编译,系统引导流程分析 TOC \o \h \z \u 1. 高通平台android开发总结. 7 1.1 搭建高通平台环境开发环境 ...

  2. XR871SDK编译框架分析

    XR871SDK编译框架分析: -> 从/src/project/echocloud_demo/gcc 输入make编译, 解析当前文件夹下的Makefile文件: # # Rules for ...

  3. BC26 OPEN开发之--LWM2M连接分析

    翔神教你学NB BC26 OPEN开发之--LWM2M连接分析 前言: NB-IOT商用已经2年多了,三大运营商都建设了大量的NB网络,尤其以中国电信最为积极,各个模组厂家推出了大量的NB模组,移远的 ...

  4. qualcomm amss 文件结构以及编译流程分析

    qualcomm amss 文件结构以及编译流程分析 https://blog.csdn.net/npjocj/article/details/8206695 AMSS的source实际上是Qualc ...

  5. 程序经编译连接后变为机器码

    程序经编译连接后变为机器码 转载于:https://www.cnblogs.com/LoveFishC/archive/2012/07/26/3845615.html

  6. 思科“万物互联”路线下一站:连接分析

    近期,思科正在将其万物互联计划推向下一个层级,将引入"连接分析".在Cisco Global Editors Conference大会上,思科宣布将立刻在基础架构中推出新的软件分析 ...

  7. windows环境中利用NMake工具编译连接C++源代码

    这篇文章是上一篇文章(http://www.cnblogs.com/LCCRNblog/p/4532643.html)的补充,因此需要先看看上一篇文章. 最近在写代码的时候,需要通过命令的方式来执行生 ...

  8. 如何将内核静态库编译连接到驱动程序中去【转】

    转自:http://blog.csdn.net/ganjianfeng2003/article/details/8089551 如何将内核静态库编译连接到驱动程序中去 2010-12-07 08:27 ...

  9. linux系统c++编译连接过程,动态库与静态库

    https://www.cnblogs.com/ucas/p/5778664.html(linux系统c++编译连接过程) http://www.cnblogs.com/skynet/p/337285 ...

最新文章

  1. 你的代码将会被GitHub埋在北极,保存1000年!
  2. MAVEN版本依赖的原则及scope
  3. 按位异或运算和求反运算解析
  4. 通过HttpListener实现简单的Http服务
  5. SPOJ - IITKWPCE Let us play with strings(回文自动机+Palindrome Series优化dp)
  6. 数据结构实验:哈希表
  7. 清明梦超能力者黄YY[树链剖分+扫描线,线段树合并]
  8. Python工程笔记(1):轨迹与日志
  9. day14——内置函数
  10. 定时任务crontab
  11. 不想业务被中断?快来解锁华为云RDS for MySQL新特性
  12. uboot第一阶段详细分析
  13. Swift的一些问题
  14. 华为云服务器怎样让网站显示不出来,云服务器网页不显示图片
  15. python手机版下载-QPython下载
  16. android平板电脑 刷机工具,安卓平板电脑刷机教程之一键刷机.pdf
  17. 无线系统笔记(1)--梯度、散度、旋度(麦克斯韦先导)
  18. 微型计算机中央处理器又称为,微处理器又称为什么
  19. 【论文阅读|浅读】DeepEmLAN: Deep embedding learning for attributed networks
  20. Redis源码解读(二十五)——集群模式—failover

热门文章

  1. 软考信息系统项目管理师_项目范围管理1---软考高级之信息系统项目管理师011
  2. 大数据之-Hadoop之HDFS_HDFS的优缺点---大数据之hadoop工作笔记0049
  3. SpringCloud工作笔记084---SpringCloud项目中,关于防止表单提交_使用redis+Aspect面向切面实现
  4. RabbitMq学习笔记006---修改RabbitMq端口号和心跳时间
  5. swift函数的用法,及其嵌套实例
  6. 一摞烙饼最上面一个的另一面为焦的概率
  7. oracle中多个数据库连接池,数据库连接池为什么要建立多个连接
  8. 随想录(easyx开发上位机)
  9. 一步一步写算法(之图创建)
  10. 计算机休眠状态播放音乐,win7系统休眠后不能播放音乐怎么解决