⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 10 arm linker.txt

📁 ads1.2学习资料,对arm初学者有帮助.
💻 TXT
📖 第 1 页 / 共 2 页
字号:
链接器的主要功能:
	
	检查选项中的错误和其他错误,给出错误或报警信息.
	解析输入目标文件之间符号的相互引用关系
	对生成文件进行优化,删除不使用的或重复的代码段
	可以产生影响 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 + -