返回首页
当前位置: 主页 > 互联网技术 > 云计算 >

U-Boot的编译、连接过程详解

时间:2014-02-24 01:09来源:电脑教程学习网 www.etwiki.cn 编辑:admin

配置完成之后,执行“make all”即可编译,从Makefile中可以了解U-Boot使用了哪些文件,哪个文件首先执行、可执行文件占用内存的情况。

首先确定用到哪些文件:(某些文件是编译之后才生成的)

(1)include/config.mk文件:其中定义了ARCH、CPU、BOARD、SOC 4个变量的值;

ARCH = arm

CPU = s5pc11x

BOARD = smdkc110

VENDOR = samsung

SOC = s5pc110

 

(2)顶层config.mk:它根据上面4个变量的值确定了编译器、编译选项等,其中对理解编译过程有帮助的是BOARDDIR、LDFLAGS的值:

board/smdk2410/config.mk中,定义了“TEXT BASE = 0x33F80000”,所以最终结果如下;

BOARDDIR = smdk2410

LDFLAGS中有“-T board/smdk2410/U-Boot.lds -Ttext 0x33F80000”字样;


我的是:TEXT_BASE = 0xc3e00000)


(3)OBJS的第一个值为cpu/$(CPU)/start.o,即“cpu/arm920t/start.o”

LIBS变量就是平台/开发板相关的各个目录、通用目录下相应的库;

OBJS、LIBS所代表的.o、.a文件就是U-Boot的构成,OBJS中的每个成员,都将进入cpu/arm920t中编译;LIBS中的每个成员,都将进入相应的子目录执行“make”命令,它们将Makefile中指定的文件编译、连接成一个库文件。

当所有OBJS、LIBS所表示的.o和.a文件都生成之后,就剩下最后的链接了。

(4)首先连接得到ELF格式的U-Boot,最后转换为二进制格式的U-Boot.bin、S-Record格式的U-Boot.srec;

LDFLAGS确定了连接方式,其中“-T board/smdk2410/U-Boot.lds -Ttext 0x33F80000”字样指定了程序的布局、地址

cpu/arm920t/start.o被放在程序的最前面,所以U-Boot的入口点cpu/arm920t/start.s中。

总结一下U-Boot的编译流程:

(1)首先编译cpu/$(CPU)/start.s;

(2)对于平台/开发板相关的每个目录,每个通用目录都使用它们各自的Makefile生成相应的库;

(3)将1、2步骤生成的.o、.a文件按照board/$(BOARDDIR)/config.mk文件中指定的代码段起始地址、board/$(BOARDDIR)/U-Boot.lds连接脚本进行连接;

(4)第3步得到的是ELF格式的U-Boot,后面Makefile还会将它转换为二进制格式、S-Record格式。

------分隔线----------------------------
标签(Tag):云计算
------分隔线----------------------------
推荐内容
猜你感兴趣