重定位和链接脚本
来源:互联网 发布:微拍网站源码带采集 编辑:程序博客网 时间:2024/05/17 03:56
重定位实际就是在运行地址处执行一段位置无关码PIC,让这段PIC(也就是重定位代码)从运行地址处把整个程序镜像拷贝一份到链接地址处,完了之后使用一句长跳转指令从运行地址处直接跳转到链接地址处去执行同一个函数,这样就实现了重定位之后的无缝连接。
链接地址:链接时指定的地址(指定方式为:Makefile中用-Ttext,或者链接脚本)
运行地址:程序实际运行时地址(指定方式:由实际运行时被加载到内存的哪个位置说了算)
为什么需要重定位
链接地址和运行地址有时候必须不相同,而且还不能全部用位置无关码,这时候只能重定位。
重定位中两个重要的伪指令
ldr是长加载,ldr指令在加载符号地址时,加载的是链接地址。
adr是短加载,adr指令加载符号地址,加载的是运行时地址
链接脚本其实是个规则文件,他是程序员用来指挥链接器工作的。链接器会参考链接脚本,并且使用其中规定的规则来处理.o文件中那些段,将其链接成一个可执行程序。
链接脚本的关键内容有2部分:段名 + 地址(作为链接地址的内存地址)
链接脚本的理解:
SECTIONS {......} 这个是整个链接脚本
. 点号在链接脚本中代表当前位置。
= 等号代表赋值
程序段的概念:代码段、数据段、bss段(ZI段)、自定义段
段就是程序的一部分,我们把整个程序的所有东西分成了一个一个的段,给每个段起个名字,然后在链接时就可以用这个名字来指示这些段。也就是说给段命名就是为了在链接脚本中用段名来让段站在核实的位置。
段名分为2种:一种是编译器链接器内部定好的,先天性的名字;
一种是程序员自己指定的、自定义的段名。
先天性段名:
代码段:(.text),又叫文本段,代码段其实就是函数编译后生成的东西
数据段:(.data),数据段就是C语言中有显式初始化为非0的全局变量
bss段:(.bss),又叫ZI(zero initial)段,就是零初始化段,对应C语言中初始化为0的全局变量。
后天性段名:
段名由程序员自己定义,段的属性和特征也由程序员自己定义。
阅读全文
0 0
- 重定位和链接脚本
- 重定位引入和链接脚本1
- S5PV210重定位引入和链接脚本
- 05 重定位和链接脚本
- 重定位引入和链接脚本
- 重定位和链接
- 重定位和链接
- 重定位引入和链接脚本2~3
- 六.ARM裸机学习之重定位和链接脚本
- 链接重定位和装载重定位
- S5PV210系列(裸机六)之 重定位引入和链接脚本
- 链接--地址重定位
- 链接时重定位
- 链接重定位
- [CSAPP-II] 链接[符号解析和重定位] 静态链接 动态链接 动态链接接口
- 南大Mooc计算机体系基础--重定位和动态链接
- 静态链接、动态链接、静态重定位、动态重定位
- 重定位及动态链接
- Linux基本操作
- hibernate框架的简单实例
- Keras实现小数量集图片分类——6类别Birds数据集分类
- 【POJ】3040
- SpringBoot中配置使用Druid数据库连接池
- 重定位和链接脚本
- linux下使用libmad库实现mp3文件的解码、播放
- 过滤器和拦截器
- ubuntu16.04下udev权限问题
- 328. Odd Even Linked List
- 关于后缀表达式的转换
- vim快捷键使用
- 正则表达式
- Unity之图片轮播组件实现