重定位

链接原理

房东的猫 提交于 2019-11-27 04:16:36
本文简单介绍了程序的链接原理。学习链接原理有助于程序员理解程序的本质,同时也可以为日后的大型软件的代码开发打下坚实的基础。由此可知链接原理的重要性,尤其是一些程序员被一些莫名其妙的错误困扰的时候,更加能够体会到这一点。 1 连接器的任务 连接器将多个目标文件链接成一个完整的、可加载、可执行的目标文件。其输入是一组可重定位的目标文件。链接的两个主要任务如下: (1) 符号解析,将目标文件内的引用符号和该符号的定义联系起来。 (2) 将符号定义与存储器的位置联系起来,修改对这些符号的引用。 2 目标文件 典型的目标文件分为以下3种形式: (1) 可重定位目标文件 这种文件包含二进制代码和数据,这些代码和数据已经转换成了机器指令代码和数据,但是还不可以直接执行。因为这些指令和数据中往往引用其他模块(目标文件)中的符号,这些其他模块的符号对于本模块来说是未知的,这些符号的解析需要链接器将所有模块进行链接。这种操作称为“重定位”,因此,这种目标文件被称为“可重定位的目标文件”,后缀名通常为*.o (2) 可执行目标文件 这种文件同样包含了二进制代码和数据。所不同的是,这种文件已经经过了链接操作,和所有的模块(目标文件)都产生了联系。链接器将所有需要的可重定位目标文件连接成一个可执行目标文件。这时,每个目标文件中引用其他目标文件中的符号都已经得到了解析和重定位。因此,每个符号都是已知的了

2019-8-10-linux

走远了吗. 提交于 2019-11-27 02:24:30
2019-8-10-linux 程序的组成 代码重定位 基本概念 链接脚本的作用 链接脚本介绍 链接脚本代码实例分析 C函数怎么使用lds文件中的变量 如何编写位置无关码 重定位代码实例分析 方式一 重点: #F44336 方式二 C函数怎么使用lds文件中的变量 #F44336 汇编文件中可以直接使用外部连接脚本中的变量,但C函数中要加上取地址符号的原因: 程序的组成 代码段:用于存放数据 数据段:用于存放全变量(有初始值,且不为零) 只读数据段:用于存放只读数据,如:const 变量 bss段:用于存放未初始化的全局变量,或初始化为零的全局变量 comment段:用于存放代码的一些注释信息 其中bss段和comment的内容不存放在bin文件中。 代码重定位 为什么需要代码的重定位 2440的启动方式有两种,nor flash启动和nand flash启动。(1) 首先讲解norflash启动的特点,noflash启动时,norflash中的内容可以像内存一样写,但是不能像内存一样读,因此会出现程序中变量进行修改无效的情况,其内部深层次的原因是,程序中的全局变量和静态变量都存放在bin上,写在norflash中,直接修改无效,因此需要重定位。(2)若采用nand flash启动,2440默认会将nand flash的前4k内容拷贝到sram中,此时sram的地址是从0开始的