ARM体系结构与编程(第2版)第11章_第1页
ARM体系结构与编程(第2版)第11章_第2页
ARM体系结构与编程(第2版)第11章_第3页
ARM体系结构与编程(第2版)第11章_第4页
ARM体系结构与编程(第2版)第11章_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 第第11章章 ARM连接器连接器 11.1 ARM映像文件映像文件 ARM中的各种源文件(包括汇编程序、C语言程序以及 C+程序)经过ARM编译器编译后,生成ELF格式的目标 文件。这些目标文件和相应的C/C+运行时库经过ARM 连接器处理后,生成ELF格式的映像文件(Image)。这种 ELF格式的映像文件可以被写入嵌入式设备的ROM中。 本节介绍这种ELF格式的映像文件的结构。 2 11.1.1 ARM映像文件的组成映像文件的组成 1. ARM映像文件的组成部分映像文件的组成部分 一个映像文件由一个或多个域组成。 每个域包含一个或多个输出段。 每个输出段包含一个或多个输入段。 各输入段包

2、含了目标文件中的代码和数据。 3 11.1.1 ARM映像文件的组成映像文件的组成 2. ARM映像文件各组成部分的地址映射映像文件各组成部分的地址映射 ARM映像文件各组成部分在存储系统中的地址有两种: 一种是在映像文件位于存储器中时(也就是该映像文件开 始运行之前)的地址,称为加载时地址;一种是在映像文 件运行时的地址,称为运行时地址。 在图11.2给出的例子中,RW段的加载时地址为 0 x6000(指该段所占的存储区域的起始地址),该地址位 于ROM中;RW段的运行时地址为0 x8000(指该段所占 的存储区域的起始地址),该地址位于RAM中。 4 RO段 RAM 加载时的地址映射关系运

3、行时的地址映射关系 0 x0000 0 x6000 0 x8000 0 xa000 0 xffff RW段 RO段 RW段 ZI 段 ROM 11.1.2 ARM映像文件的入口点映像文件的入口点 1. ARM映像文件中的两类入口点映像文件中的两类入口点 2. 定义初始入口点定义初始入口点 3. 普通入口点的用法普通入口点的用法 5 11.1.3 输入段的排序规则输入段的排序规则 通常情况下,一个输出段中,各输入段的排列顺序通常情况下,一个输出段中,各输入段的排列顺序 是由下面几个因素决定的。用户也可以通过连接选是由下面几个因素决定的。用户也可以通过连接选 项项-first和和-last来改变这

4、些规则。来改变这些规则。 输入段的属性。 输入段的名称。 各输入段在连接命令行的输入段列表中的排列顺序。 按照输入段的属性,其排列顺序如下所示。按照输入段的属性,其排列顺序如下所示。 (1)只读的代码段。 (2)只读的数据段。 (3)可读写的代码段。 (4)其他已经初始化的数据段。 (5)未初始化的数据。 6 11.2 ARM连接器介绍连接器介绍 ARM开发包中包含了连接器开发包中包含了连接器armlink,它将编译得,它将编译得 到的到的ELF格式的目标文件以及相关的格式的目标文件以及相关的C/C+运行时运行时 库进行连接,生成相应的结果文件。库进行连接,生成相应的结果文件。 具体来说,具体

5、来说,armlink可以完成以下操作:可以完成以下操作: 连接编译后得到的目标文件和相应的C/C+运行时库, 生成可执行的映像文件。 将一些目标文件进行连接,生成一个新的目标文件,供 将来进一步连接时使用,这称为部分连接。 指定代码和数据在内存中的位置。 生成被连接文件的调试信息和相互间的引用信息。 7 11.2 ARM连接器介绍连接器介绍 armlink在进行部分连接和完全连接生成可执行的映像文件时所进行的在进行部分连接和完全连接生成可执行的映像文件时所进行的 操作是不同的。下面分别介绍这两种情况。操作是不同的。下面分别介绍这两种情况。 (1)armlink在进行完全连接生成可执行的映像文件

6、时执行下面的操 作。 解析输入的目标文件之间的符号引用关系。 根据输入目标文件对C/C+函数的调用关系,从C/C+运行时库 中提取相应的模块。 将各输入段排序,组成相应的输出段。 删除重复的调试信息段。 根据用户指定的分组和定位信息,建立映像文件的地址映射关 系。 重定位需要重定位的值。 生成可执行的映像文件。 (2)armlink在进行部分连接生成新的目标文件时执行下面的操作。 删除重复的调试信息段。 最小化符号表的大小。 保留那些未被解析的符号。 生成新的目标文件。 8 11.3 ARM连接器生成的符号连接器生成的符号 ARM连接器定义了一些符号,这些符号中都包含字符连接器定义了一些符号,

7、这些符号中都包含字符$。 ARM连接器在生成映像文件时,用它们来代表映像文件中连接器在生成映像文件时,用它们来代表映像文件中 各域的起始地址以及存储区域界限、各输出段的起始地址以各域的起始地址以及存储区域界限、各输出段的起始地址以 及存储区域界限、各输入段的起始地址以及存储区域界限。及存储区域界限、各输入段的起始地址以及存储区域界限。 比如,比如,Load$region_name$Base代表域代表域region_name 加载时的起始地址;而加载时的起始地址;而image$region_ name$Base代表代表 域域region_name运行时的起始地址。运行时的起始地址。 这些符号可以

8、被汇编程序引用,用于地址重定位。这些符号这些符号可以被汇编程序引用,用于地址重定位。这些符号 可以被可以被C程序作为外部符号引用。程序作为外部符号引用。 所有这些符号,只有在其被应用程序引用时,所有这些符号,只有在其被应用程序引用时,ARM连接器连接器 才会生成该符号。才会生成该符号。 推荐使用映像文件中与域相关的符号,而不是使用与段相关推荐使用映像文件中与域相关的符号,而不是使用与段相关 的符号。的符号。 9 11.3.1 连接器生成的与域相关的符号连接器生成的与域相关的符号 连接器生成的与域相关的符号如表连接器生成的与域相关的符号如表11.1所示。各符号的命名所示。各符号的命名 规则是:如

9、果使用了地址映射配置文件规则是:如果使用了地址映射配置文件(scatter文件文件),该文,该文 件规定了映像文件中各域的名称;如果未使用地址映射配置件规定了映像文件中各域的名称;如果未使用地址映射配置 文件文件(scatter文件文件),连接器按照下面的规则确定各符号中的,连接器按照下面的规则确定各符号中的 region_name: 对于只读的域,使用名称ER_RO。 对于可读写的域,使用名称ER_RW。 对于使用0初始化的域,使用名称ER_ZI。 10 符号名称含 义 Load$region_name$Base域region_name的加载时起始地址 Image$region_name$B

10、ase域region_name的运行时起始地址 Image$region_name$Length域region_name运行时的长度(为4字节的倍数) Image$region_name$Limit 域region_name运行时存储区域末尾的下一个字节地址(该地址不属于域region_name所占的存 储区域) 11.3.1 连接器生成的与域相关的符号连接器生成的与域相关的符号 对于映像文件的每个域,如果其中包含了对于映像文件的每个域,如果其中包含了ZI属性的属性的 输出段,连接器将会为该输出段,连接器将会为该ZI输出段生成另外的符号。输出段生成另外的符号。 这些符号如表这些符号如表11.2

11、所示。所示。 11 符号名称含 义 Image$region_name$ ZI$Base域region_name中ZI输出段的运行时起始地址 Image$region_name$ ZI$Length域region_name中ZI输出段运行时的长度(为4字节的倍数) Image$region_name$ ZI$Limit 域region_name中ZI输出段运行时存储区域末尾的下一个字节地址(该地址不属于域 region_name所占的存储区域) 11.3.2 连接器生成的与输出段相关的符号连接器生成的与输出段相关的符号 如果未使用地址映射配置文件如果未使用地址映射配置文件(scatter文件文

12、件),连接,连接 器生成的与输出段相关的符号如器生成的与输出段相关的符号如 表表11.3所示;如所示;如 果使用了地址映射配置文件果使用了地址映射配置文件(scatter文件文件),表,表11.3 中所列的符号没有意义,如果应用程序使用了这些中所列的符号没有意义,如果应用程序使用了这些 符号,将可能得到错误的结果,这时应该使用上一符号,将可能得到错误的结果,这时应该使用上一 小节中介绍的与域相关的符号。小节中介绍的与域相关的符号。 12 符号名称含 义 Image $RO$BaseRO输出段运行时的起始地址 Image$RO$LimitRO输出段运行时存储区域的界限 Image $RW$Bas

13、eRW输出段运行时的起始地址 Image$RW$LimitRW输出段运行时的存储区域界限 Image $ZI$BaseZI输出段运行时的起始地址 Image$ZI$LimitZI输出段运行时存储区域的界限 11.3.3 连接器生成的与输入段相关的符号连接器生成的与输入段相关的符号 ARM连接器为映像文件中的每一个输入段生成两个连接器为映像文件中的每一个输入段生成两个 符号,如表符号,如表11.4所示。所示。 13 符号名称含 义 SectionName$BaseSectionName输入段运行时的起始地址 SectionName $LimitSectionName输入段运行时的存储区域界限 1

14、1.4 连接器的优化功能连接器的优化功能 1. 删除重复的调试信息段删除重复的调试信息段 2. 删除重复的代码段删除重复的代码段 3. 删除未使用的段删除未使用的段 4. 生成小代码段生成小代码段(veneer) 14 11.5 运行时库的使用运行时库的使用 ARM连接器使用连接器使用C/C+运行时库的基本步骤如下。运行时库的基本步骤如下。 (1)ARM连接器根据一定的规则确定需要使用哪些 C/C+运行时库。具体的规则在11.5.1小节中介绍。 (2)从各搜索路径中查找相应的C/C+运行时库。参 见11.5.2小节中的介绍。 (3)选择合适种类的C/C+运行时库。适应于不同的 编译选项和连接选

15、项,各C/C+运行时库具有不同的种 类。参见11.5.3小节中的介绍。 (4)重复扫描各C/C+运行时库,解析各符号。参见 11.5.4小节中的介绍。 15 11.5.1 C/C+运行时库与目标文件运行时库与目标文件 ARM中中C/C+运行时库就是一些运行时库就是一些ELF格式的目标文件的集合,这些目标格式的目标文件的集合,这些目标 文件是按照文件是按照ar格式组织在一起的。格式组织在一起的。ARM连接器在使用一般目标文件和连接器在使用一般目标文件和 C/C+运行时库时有所不同。其主要区别如下所示。运行时库时有所不同。其主要区别如下所示。 (1)在ARM连接器的输入列表中的所有目标文件将被无条

16、件地包含到 输出的映像文件中,而不论该目标文件是否被其他的目标文件引用。如果 用户在连接时没有指定连接选项-noremove,连接器将会在后面的处理中 删除映像文件中没有被使用的段。 (2)而连接器在使用C/C+运行时库时,有所不同,主要遵守下面的 规则: 如果在连接器的输入列表中显式地指定了C/C+运行时库的某成员, 则该成员将被无条件地包含到输出的映像文件中,而不论该成员是否 被其他的目标文件引用。 如果C/C+运行时库中某成员被其他的目标文件按nonweak方式引 用,或者被其他已经被包含的C/C+运行时库中的成员按nonweak方 式引用,则该C/C+运行时库中的成员将会被包含到输出的

17、映像文件 中。 被按weak方式引用的C/C+运行时库中的成员不会被包含到输出的映 像文件中。 16 11.5.2 查找需要的查找需要的C/C+运行时库运行时库 可以通过下面可以通过下面3种方法来指定种方法来指定ARM标准标准C/C+运行运行 时库的路径。其中连接选项时库的路径。其中连接选项-libpath指定的指定的ARM标标 准准C/C+运行时库的路径优先级高于使用环境变量运行时库的路径优先级高于使用环境变量 ARMLIB指定的指定的ARM标准标准C/C+运行时库的路径。运行时库的路径。 使用连接选项-libpath来指定ARM标准C/C+运行时库 的路径。这时指定的是包含路径armlib

18、和cpplib的父路 径。 使用Code Warrior IDE中关于连接选项的控制面板来指 定ARM标准C/C+运行时库的路径。 使用环境变量ARMLIB来指定ARM标准C/C+运行时库 的路径。这时ARMLIB被设置成包含路径armlib和cpplib 的父路径。 17 11.5.3 选择合适种类的选择合适种类的C/C+运行时库运行时库 针对不同的编译选项和连接选项,各针对不同的编译选项和连接选项,各C/C+运行时运行时 库具有不同的种类。各种不同种类的库具有不同的种类。各种不同种类的C/C+运行时运行时 库是依靠其名称来识别的。库是依靠其名称来识别的。C/C+运行时库的命名运行时库的命名

19、 格式如下所示:格式如下所示: root_. 18 11.5.4 扫描扫描C/C+运行时库运行时库 在从上面的操作中得到需要使用的在从上面的操作中得到需要使用的C/C+运行时库,运行时库,ARM 连接器扫描这些连接器扫描这些C/C+运行时库,加载相应的对象,解析各运行时库,加载相应的对象,解析各 目标文件中的符号。具体操作步骤如下。目标文件中的符号。具体操作步骤如下。 (1)ARM连接器按顺序扫描各C/C+运行时库,以完成所有的 nonweak方式的引用关系。这样,如果有多个目标可以满足引用关 系,则排在前面的库被使用。这是一个必须注意的特点。 (2)如果某个库的成员满足引用要求,该成员被加载

20、,从而解 析了相应的符号。该成员函数的引入也可能实现了weak方式的引 用。 (3)在引入某个成员后,在解析了一些符号同时,可能带来新 的需要解析的符号。 (4)这种解析过程重复进行,直到解析完所有的符号,或者确 定某些符号不能被解析为止。 19 11.6 从一个映像文件中使用另一个映像文件中的符号从一个映像文件中使用另一个映像文件中的符号 在在ARM中,从一个映像文件中访问另一个映像文件中,从一个映像文件中访问另一个映像文件 中的符号是通过中的符号是通过symdefs文件实现的。本节介绍这文件实现的。本节介绍这 些相关的技术。些相关的技术。 20 11.6.1 symdefs文件文件 sym

21、defs文件是一种目标文件。与普通的目标文件文件是一种目标文件。与普通的目标文件 不同的是,其中只包含了符号和其对应的数值,没不同的是,其中只包含了符号和其对应的数值,没 有包含代码和数据。一个有包含代码和数据。一个symdefs文件通常包括文件通常包括3 部分:一个标识符;可选的注释部分;包含符号和部分:一个标识符;可选的注释部分;包含符号和 其对应的数值的部分。下面是一个其对应的数值的部分。下面是一个symdefs文件的文件的 简单例子。它包括了一个简单例子。它包括了一个symdefs文件通常包含的文件通常包含的 3部分。部分。 标识符:标识符: # 注释:注释: ; value type

22、 name, this is an added comment 21 11.6.1 symdefs文件文件 1. 标识符字符串标识符字符串 2. 注释注释 3. 符号及其对应的值符号及其对应的值 (1)符号的地址值:ARM连接器使用固定的十六进制 值来表示符号的地址值。用户在修改该地址值时可以使 用十六进制,也可以使用十进制。 (2)符号的类型:它有下面3类。 A:ARM代码符号。 T:Thumb代码符号。 D:数据符号。 (3)符号名称:满足ARM中关于合法符号的定义。 22 11.6.2 建立建立symdefs文件文件 在完成所有的其他连接操作后,在完成所有的其他连接操作后,ARM连接器可

23、以生连接器可以生 成一个成一个symdefs文件。对于部分连接和失败的连接文件。对于部分连接和失败的连接 操作,操作,ARM连接器不会产生连接器不会产生symdefs文件。文件。 使用连接选项使用连接选项-symdefs filename生成相应的生成相应的 symdefs文件时,可以有下面两种情况:文件时,可以有下面两种情况: 如果连接选项中指定的文件filename不存在,在ARM连 接器生成包括所有全局符号的symdefs文件。 如果连接选项中指定的文件filename已存在,则该文件 的内容将限制ARM连接器生成的symdefs文件中包括哪 些符号。 23 11.6.3 symdefs

24、文件的使用文件的使用 使用使用symdefs文件的方法与使用普通的目标文件相文件的方法与使用普通的目标文件相 同,将其作为输入文件。同,将其作为输入文件。ARM连接器从连接器从symdefs文文 件中提取需要的符号及其相关信息,将这些信息加件中提取需要的符号及其相关信息,将这些信息加 入到输出符号表中,这些符号具有入到输出符号表中,这些符号具有ABSOLUTE和和 GLOBAL属性。属性。ARM连接器像对待从其他目标文连接器像对待从其他目标文 件中提取的符号一样对待这些符号。件中提取的符号一样对待这些符号。 在从在从symdefs文件中提取符号及其相关信息时,在文件中提取符号及其相关信息时,在

25、 下列情况下,下列情况下,ARM连接器认为该符号为非法符号,连接器认为该符号为非法符号, 将产生错误信息:将产生错误信息: 该符号的某一列信息为空时。 该符号的某一列具有非法的数值时。 24 11.7 隐藏或者重命名全局符号隐藏或者重命名全局符号 本节介绍如何将输出文件中的符号隐藏或者重命本节介绍如何将输出文件中的符号隐藏或者重命 名。这样可以避免全局符号名称冲突。名。这样可以避免全局符号名称冲突。ARM提供的提供的 steering格式的文件就是用于这一目的。格式的文件就是用于这一目的。 25 11.7.1 steering文件的格式文件的格式 steering文件是一个文本文件,其格式如下

26、:文件是一个文本文件,其格式如下: 第1个非空格字符为字符“#”或者“;”的行是注释行, 注释行是被作为空行来对待的。 其中可以包含空行,以提高可读性。空行将被ARM连接 器忽略。 既非空行,也非注释行的行,可以是一个完整的命令, 也可以是一个命令的一部分,因为一个命令可以跨多个 行。 一个命令行的最后一个非空格字符如果为字符“,”,表 示下面的一行是本命令的续行部分。 26 11.7.2 steering文件中的命令文件中的命令 1. RENAME 2. HIDE 3. SHOW 27 11.8 ARM连接器的命令行选项连接器的命令行选项 ARM连接器的命令行格式如下所示:连接器的命令行格式

27、如下所示: armlink -help -vsn -partial -output file -elf -ro-base address -ropi -rw-base address -rwpi -split -scatter file -debug|-nodebug -remove (RO/RW/ZI)|-unremove -entry location -keep section- id -first section-id -last section-id -libpath pathlist -scanlib|- noscanlib -locals|-nolocals -callgraph

28、 -info topics -map -symbols - symdefs file -edit file -xref -xreffrom object(section) -xrefto object(section) -errors file -list file -verbose -unmangled |-mangled -via file -strict -unresolved symbol input-file-list 28 11.8 ARM连接器的命令行选项连接器的命令行选项 其中选项的含义及用法如下所示。其中选项的含义及用法如下所示。 1. -help 2. -vsn 3. -p

29、artial 4. -output file 5. -elf 6. -ro-base address 7. -ropi 8. -rw-base address 9. -rwpi 10. -split 11. -scatter file 12. -debug 29 11.8 ARM连接器的命令行选项连接器的命令行选项 13. -nodebug 14. -remove(RW/RO/ZI) 15. -unremove 16. -entry location 17. -keep section-id 18. -first section-id 19. -last section-id 20. -lib

30、path pathlist 21. -scanlib 22. -noscanlib 23. -locals 24. -nolocals 30 11.8 ARM连接器的命令行选项连接器的命令行选项 25. -callgraph 26. -info topics 27. -map 28. -symbols 29. -symdefs file 30. -edit file 31. -xref 32. -xreffrom object(section) 33. -xrefto object(section) 34. -errors file 31 11.8 ARM连接器的命令行选项连接器的命令行选项

31、35. -list file 36. -verbose 37. -unmangled 38. -mangled 39. -via file 40. -strict 41. -unresolved symbol 42. -input-file-list 32 11.9 使用使用scatter文件定义映像文件的地址映射文件定义映像文件的地址映射 根据映像文件中地址映射的复杂程度,有两种方法来告诉根据映像文件中地址映射的复杂程度,有两种方法来告诉ARM连接器连接器 这些相关的信息。对于映像文件中地址映射关系比较简单的情况,可以这些相关的信息。对于映像文件中地址映射关系比较简单的情况,可以 使用命令行选项;对于映像文件中地址映

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论