ARM体系结构与编程(第2版)第11章详解

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
符号名称 含 义 域region_name中ZI输出段的运行时起始地址
Image$$region_name$$ ZI$$Base
Image$$region_name$$ ZI$$Length
域region_源自文库ame中ZI输出段运行时的长度(为4字节的倍数)
Image$$region_name$$ ZI$$Limit
0xffff RAM 0xa000 0x8000 RW段 ROM RO段 ZI 段 RW段
0x6000 RO段
0x0000
加载时的地址映射关系
运行时的地址映射关系
5
11.1.2 ARM映像文件的入口点
1. ARM映像文件中的两类入口点
2. 定义初始入口点
3. 普通入口点的用法
6
11.1.3 输入段的排序规则
域region_name的运行时起始地址
域region_name运行时的长度(为4字节的倍数) 域region_name运行时存储区域末尾的下一个字节地址 ( 该地 址不属于域region_name所占的存储区域)
11
11.3.1 连接器生成的与域相关的符号
对于映像文件的每个域,如果其中包含了ZI属性的 输出段,连接器将会为该ZI输出段生成另外的符号。 这些符号如表11.2所示。
7
11.2 ARM连接器介绍
ARM开发包中包含了连接器armlink,它将编译得 到的ELF格式的目标文件以及相关的C/C++运行时 库进行连接,生成相应的结果文件。 具体来说,armlink可以完成以下操作:
连接编译后得到的目标文件和相应的C/C++运行时库, 生成可执行的映像文件。 将一些目标文件进行连接,生成一个新的目标文件,供 将来进一步连接时使用,这称为部分连接。 指定代码和数据在内存中的位置。 生成被连接文件的调试信息和相互间的引用信息。
通常情况下,一个输出段中,各输入段的排列顺序 是由下面几个因素决定的。用户也可以通过连接选 项-first和-last来改变这些规则。
输入段的属性。 输入段的名称。 各输入段在连接命令行的输入段列表中的排列顺序。
按照输入段的属性,其排列顺序如下所示。
(1) (2) (3) (4) (5) 只读的代码段。 只读的数据段。 可读写的代码段。 其他已经初始化的数据段。 未初始化的数据。
8
11.2 ARM连接器介绍
armlink在进行部分连接和完全连接生成可执行的映像文件时所进行的 操作是不同的。下面分别介绍这两种情况。
(1) armlink在进行完全连接生成可执行的映像文件时执行下面的操 作。 ① 解析输入的目标文件之间的符号引用关系。 ② 根据输入目标文件对C/C++函数的调用关系,从C/C++运行时库 中提取相应的模块。 ③ 将各输入段排序,组成相应的输出段。 ④ 删除重复的调试信息段。 ⑤ 根据用户指定的分组和定位信息,建立映像文件的地址映射关 系。 ⑥ 重定位需要重定位的值。 ⑦ 生成可执行的映像文件。 (2) armlink在进行部分连接生成新的目标文件时执行下面的操作。 ① 删除重复的调试信息段。 ② 最小化符号表的大小。 ③ 保留那些未被解析的符号。 ④ 生成新的目标文件。
2
第11章 ARM连接器
11.1 ARM映像文件
ARM中的各种源文件(包括汇编程序、C语言程序以及 C++程序)经过ARM编译器编译后,生成ELF格式的目标 文件。这些目标文件和相应的C/C++运行时库经过ARM 连接器处理后,生成ELF格式的映像文件(Image)。这种 ELF格式的映像文件可以被写入嵌入式设备的ROM中。 本节介绍这种ELF格式的映像文件的结构。
所有这些符号,只有在其被应用程序引用时,ARM连接器 才会生成该符号。
推荐使用映像文件中与域相关的符号,而不是使用与段相关 的符号。
10
11.3.1 连接器生成的与域相关的符号
连接器生成的与域相关的符号如表11.1所示。各符号的命名 规则是:如果使用了地址映射配置文件(scatter文件),该文 件规定了映像文件中各域的名称;如果未使用地址映射配置 文件(scatter文件),连接器按照下面的规则确定各符号中的 region_name:
9
11.3 ARM连接器生成的符号
ARM连接器定义了一些符号,这些符号中都包含字符$$。 ARM连接器在生成映像文件时,用它们来代表映像文件中 各域的起始地址以及存储区域界限、各输出段的起始地址以 及存储区域界限、各输入段的起始地址以及存储区域界限。 比如,Load$$region_name$$Base代表域region_name 加载时的起始地址;而image$$region_ name$$Base代表 域region_name运行时的起始地址。 这些符号可以被汇编程序引用,用于地址重定位。这些符号 可以被C程序作为外部符号引用。
3
11.1.1 ARM映像文件的组成
1. ARM映像文件的组成部分
一个映像文件由一个或多个域组成。 每个域包含一个或多个输出段。 每个输出段包含一个或多个输入段。 各输入段包含了目标文件中的代码和数据。
4
11.1.1 ARM映像文件的组成
2. ARM映像文件各组成部分的地址映射
ARM映像文件各组成部分在存储系统中的地址有两种: 一种是在映像文件位于存储器中时(也就是该映像文件开 始运行之前)的地址,称为加载时地址;一种是在映像文 件运行时的地址,称为运行时地址。 在图11.2给出的例子中,RW段的加载时地址为 0x6000(指该段所占的存储区域的起始地址),该地址位 于ROM中;RW段的运行时地址为0x8000(指该段所占 的存储区域的起始地址),该地址位于RAM中。
域region_name中ZI输出段运行时存储区域末尾的下一个字 节地址(该地址不属于域region_name所占的存储区域)
对于只读的域,使用名称ER_RO。 对于可读写的域,使用名称ER_RW。 对于使用0初始化的域,使用名称ER_ZI。
符号名称 含 义 域region_name的加载时起始地址
Load$$region_name$$Base
Image$$region_name$$Base Image$$region_name$$Length Image$$region_name$$Limit
相关文档
最新文档