重定位和链接脚本

来源:互联网 发布:微拍网站源码带采集 编辑:程序博客网 时间: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的全局变量。
后天性段名
段名由程序员自己定义,段的属性和特征也由程序员自己定义。
原创粉丝点击