官方标准uboot移植4之编写自己的uboot

时间:2024-05-22 20:52:22

1.由源码到可执行程序的过程

1)源码.c->(编译)->elf可执行程序

2)源码.c->(编译)->目标文件.o->(链接)->elf可执行程序

3)源码.c->(编译)->汇编文件.S->(汇编)->目标文件.o->(链接)->elf可执行程序

4)源码.c->(预处理)->预处理过的.i源文件->(编译)->汇编文件.S->(汇编)->目标文件.o->(链接)->elf可执行程序

预处理用预处理器,编译用编译器,汇编用汇编器,链接用链接器,这几个工具再加上其他一些额外的会用到的可用工具,合起来叫编译工具链。gcc就是一个编译工具链。

官方标准uboot2013移植4之编写自己的uboot

如上图所示一个程序编译的过程分为:

1)预编译:预编译器执行。譬如C中的宏定义就是由预编译器处理,注释等也是由预编译器处理的。

2)编译:编译器来执行。把源码.c 编译成.S文件。

3)汇编:汇编器来执行。把.S文件编译成.o文件。

4)链接:链接器来执行。把.o文件中的各函数(段)按照一定规则(链接脚本来指定)累积在一起,形成可执行文件。

【链接脚本其实是个规则文件,他是程序员用来指挥链接器工作的。链接器会参考链接脚本,并且使用其中规定的规则来处理.o文件中那些段,将其链接成一个可执行程序。

              链接脚本的关键内容有2部分:段名 + 地址(作为链接地址的内存地址)

              链接脚本的理解:

              SECTIONS {}    这个是整个链接脚本

              . 点号在链接脚本中代表当前位置。

              = 等号代表赋值】

5)生成二进制文件:objcopy:由可执行程序生成可烧录的镜像bin文件。

后面是一些可选部分:

strip: strip是把可执行程序中的符号表信息给拿掉,以节省空间。(Debug版本和Release版本)

Objdump:由elf格式文件反汇编提供给我们观看、调试。

2.编写自己的uboot

官方标准uboot2013移植4之编写自己的uboot

-------------------uboot中copy添加的led代码操作过程-----------------

官方标准uboot2013移植4之编写自己的uboot

1)首先打开目的文件

官方标准uboot2013移植4之编写自己的uboot

2)然后shift+g跳转到文件末尾

官方标准uboot2013移植4之编写自己的uboot

3)把文件行数显示出来--:set nu

官方标准uboot2013移植4之编写自己的uboot

4)输入shift+’’+a+35+yy

官方标准uboot2013移植4之编写自己的uboot

最后面显示35行被复制

5)打开我们当前的文件

官方标准uboot2013移植4之编写自己的uboot

6) 在尾部输入shift+’’+a+p

官方标准uboot2013移植4之编写自己的uboot

-------------------uboot中copy添加的led代码操作过程-----------------

2.1编写mystart.S文件

官方标准uboot2013移植4之编写自己的uboot

2.2编写mylowlevel_init.S文件

官方标准uboot2013移植4之编写自己的uboot

2.3编译

1)使用汇编器编译

官方标准uboot2013移植4之编写自己的uboot

2)使用gcc编译

官方标准uboot2013移植4之编写自己的uboot

这里gcc –c是指只编译不链接

3.编译生成的.o文件的结构

一般分成三个部分:.text段(代码段)、.data段、.bss段。

我们使用arm-linux-size指令来看下我们mystart.o的信息:

官方标准uboot2013移植4之编写自己的uboot

3.1 bss段与data段的区别

代码段、数据段、bss

1)编译器在编译程序的时候,将程序中的所有的元素分成了一些组成部分,各部分构成一个段,所以说段是可执行程序的组成部分。

2)代码段:代码段就是程序中的可执行部分,直观理解代码段就是函数堆叠组成的。函数的动作就是代码段。

3)数据段(也被称为数据区、静态数据区、静态区):数据段就是程序中的数据,直观理解就是C语言程序中的全局变量。(注意:全局变量才算是程序的数据,局部变量不算程序的数据,只能算是函数的数据)

4)bss段(又叫ZI(zero initial)段):bss段的特点就是被初始化为0bss段本质上也是属于数据段,bss段就是被初始化为0的数据段。

注意区分:数据段(.data)和bss段的区别和联系:二者本来没有本质区别,都是用来存放C程序中的全局变量的。区别在于把显示初始化为非零的全局变量存在.data段中,而把显式初始化为0或者并未显式初始化(C语言规定未显式初始化的全局变量值默认为0)的全局变量存在bss段。

4.链接的过程

把两个文件的三个部分合在一起。

官方标准uboot2013移植4之编写自己的uboot官方标准uboot2013移植4之编写自己的uboot

官方标准uboot2013移植4之编写自己的uboot

-Tmyboot.lds指的是指定myboot.lds是链接文件。

4.生成二进制文件

官方标准uboot2013移植4之编写自己的uboot

可以看出myboot.bin比myboot小了很多。

可以使用hexdump指令来看下myboot.bin的全部内容。