📄 10 arm linker.txt
字号:
链接器的主要功能:
检查选项中的错误和其他错误,给出错误或报警信息.
解析输入目标文件之间符号的相互引用关系
对生成文件进行优化,删除不使用的或重复的代码段
可以产生影响 veneer 文件,帮助实现ARM代码和Thumb代码之间的状态转换.
可以为指令代码段或数据段指定在目标存储器中的位置
10.1 链接的一般概念
10.1.1 目标文件与映像文件
源文件 --> 编译 --> 目标文件(elf格式以lst格式) --> 链接器 --> 映像文件(文件中程序之间的位置关系与实际存储时的地址关系是对应的)
ADS系统中默认的映像文件起始地址为 0x8000.
编译器只对单个文件, 每次编译一个文件,输出一个目标文件.链接器对多个文件工作.
目标文件和映像文件都是 elf 格式.主要的区别在于:目标文件中代码和符号的地址是不确定的,映像文件中代码和符号的地址是确定的.
文件和段:
文件是计算机操作的基本单位,段是链接器操作的基本单位.一个文件可以包含一个或多个段.
链接器的输入段来源有两种,来自源文件和来自库.输入段有三种属性: 只读段(RO),可读写段(RW),初始化为0(PI)段. 链接器的输出是一个可执行的映像文件,包含一个或多个段.
映像文件的结构:
映像文件由一个或多个域组成.
映像文件中的域,就是存放映像文件的一个存储区.
映像文件由一个或多个域组成,实际就是存放映像文件占用一个或多个存储区.
每个域包含一个或多个输出段.
每个输出段包含一个或多个输入段.链接器把属性相同的输入段按一定的顺序组织在一起,形成输出段.
每个输入段都可以包含代码和数据
10.1.2 映像文件的加载和执行
1. 加载域和执行域
加载地址: 文件在存储器中的存储地址,
执行地址: 文件运行时的地址.
在比较简单的系统中,以上两种地址是同一地址,而在复杂的系统中,常常把程序的一部分或全部从存储区域移出去,此时运行时的执行地址就不再是加载地址,
2. 位置无关 (independent)
各个目标文件在链接成映像文件之前,输入段的长度和位置很难确定.要求输入段必须对在存储器中的位置没有要求,即位置无关.
与位置无关的输入段,链接器可以任意排序和根本地址.
与位置无关相反的概念是地址相关.程序员对输入段的地址提出要求,这个地址为绝对地址.
3. 映像文件的入口点
初始入口点和普通入口点
初始入口点存储在elf格式的文件中,每个映像文件只有一个初始入口点.
初始入口点的两个条件:
它必须总是位于映像文件的可执行地址范围内;
这个地址范围不能被覆盖,且加载地址和执行地址总是同一个地址.
如果没有为链接器指定初始入口点,但输入段中只包含一个入口点,链接器就默认该入口点为初始入口点.
在汇编语言源文件中,由 ENTRY 伪指令定义的入口点是普通入口点,并可定义多个入口点.
10.1.3 输入段在映像文件中的排列顺序.
1. 为输入段指定地址的方法
输入段的地址有两种,由程序员指定的绝对地址;与指定输入段位置无关,由链接器为输入段指定地址.
命令行和图形中使用和地址有关的选项, -ro-base,-rw-base,-split.ropi,rwpi.
为输入段指定位置的选项:包括 -entry location , -first section-id, -last section-id.
当目标系统和映像文件很复杂时,使用scatter格式文件,可以为每个输入段指定详细的地址信息.
2. 输入文件的排序规则
没指定位置的输入段在输入段的排列顺序决定,输入段的排列顺序与段的属性,段的名称,和段在输入列表中的位置有关.
在默认情况下,链接器生成的映像文件包括 RO, RW, ZI 三种属性的输出段,链接器按照下列顺序组织输入段:
只读代码段
只读数据段
可读写代码段
非零初始化的数据段
零初始化的数据段
具有相同属性的输入段按照段句ASCII字母表中的顺序排列,名字识别大小写.相同属性和段名的输入段按照在输入列表中的顺序排列.
10.2 链接器的使用方法
需要特别关注的设置项:
-ropi : 设置RO属性的输入段与位置无关.如果目标文件中RO属性的输入段不是绝对地址的,必须选择该选项以指定与位置无关.
-rwpi : 如果RW和ZI属性的输入段的加载地址不是绝对地址,必须选择该选项指定与位置无关.
-frist section-id : 在多个输入段进行链接的情况下,必须指定其中一个输入段成为映像文件加载域的第一段;否则,链接器不能实现正常链接.
-entry location : 应该使用该选项为链接器指定初始化入口地址.
10.3 ARM链接器选项设置
10.3.2 Output : 关于链接器输出方面的选项
Linktype选项组中的单选按钮确定使用的连接方式.
Partial:连接器执行部分连接操作,部分连接生成ELF格式的目标文件.这些文件可以在作为进行进一步连接时的输入文件,也可以作为armar工具的输入文件.不生成映像文件
Simple:连接器根据连接器选项中指定的地址映射方式,生成简单的ELF格式的映像文件,所生成的映像文件关系比较简单.
Scattered:连接器根据scatter格式的文件中指定的地址映射方式,生成地址映射关系比较复杂的ELF格式的映像文件.
RO Base :
为RO属性输出段指定开始地址,一个域可以有1-3个输出段,其中RO属性的输出段排列在前,因此RO输出段的开始地址也是域的开始地址,该地址既是域的加载地址也是域的执行地址.该地址必须字对准,如果不指定该地址,链接器使用默认地址0x8000
Ropi :
指定包含RO属性输出段的加载域和执行域是位置无关(PI),如果不使用该选项,这些域就被标记为绝对地址.
一般情况下,只读的输入段必须是只读位置无关的.
RW Base :
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -