018链接器脚本
1、链接器脚本的神奇作用
通过使用不同的链接器脚本,不需要更改源代码,就可以实现不同的功能!
链接器脚本对程序的生成有着至关重要的作用!
2、链接器脚本--->段
一个可执行程序通常是由:代码段,数据段,bss段构成的。
同样,在用于链接这个程序的链接器脚本中,就会反映出这几个段的信息。
段的信息是由SECTIONS固定的标号指明链接器脚本最重要的信息是段;
代码段里面包含的是所有文件的代码;
数据段包含的是所有文件的数据;
最基本的框架如下:
3、链接器脚本--->设置起始链接地址
. = 0x0;
.(点)表示当前位置,在整个程序中最前面,在代码段之前的位置,当然是程序的起始地址,程序的刚开始地址;
那么程序是从哪一个地址开始链接呢?后面跟的信息就是程序的链接地址;
4、链接器脚本--->对齐设置
为什么要做4字节对齐?ARM处理器在访问时实际上是采用4字节对齐的方式去访问的,所以说希望在存储一些数据时,尽量的做到4字节对齐,这样能够提高访问的效率;在存放大数据时,希望能够做到4字节对齐,也就是从4的整数倍的这样一个地址开始存放。
如果起始地址就不能做到4字节对齐,可以使用 . = ALIGN(4); 对地址进行调整;
5、链接器脚本--->使用变量
用bss_start记录当前地址,bss_end记录当前地址,但是这两个地址不一样,因为中间隔了一个bss段;
如果在程序中想计算bss段的长度,就可以用bss_end - bss_start来计算这个长度;
6、链接器脚本--->设置代码段首文件
用到不同的链接器脚本,可以让程序运行出完全不同的效果;
上面那些内容不足以对程序产生那么大影响,虽然有一些修改,但是程序不会体现出完全不同的两种效果,这个神奇之处在代码段的头文件这个位置;
程序包含多个文件,哪一个文件排在代码段的最前面呢?是有讲究的,二三四的顺序可以不管,但是第一的顺序必须管,第一个文件需要做什么CPU初始化,是首先必须要执行的代码,CPU上电之后,首先必须要执行这个代码,必须要保证,程序在链接时链接到最前面,排第一,怎么做呢?要在代码段中做一个设置。