动态链接(二) 延时绑定PLT

来源:互联网 发布:知乎广告文案 编辑:程序博客网 时间:2024/06/13 23:57

基本问题:动态链接比静态链接慢的主要原因是动态链接下对于全局和静态和数据访问都要进行复杂的GOT定位,然后进行间接寻址。还有各种的动态重定位。

 

1>延时绑定的基本思想:函数在被第一次用到时才进行绑定(符号查找,重定位等),没有用到则不绑定。具体elfplt实现。真正用到的函数_dl_runtime_resolve()

 

2>现在在调用到查找.got之间又插入一个过程。通过一个plt项结构来进行跳转。每个外部函数在PLT中都有一个相应的项function@plt表示functionplt中的地址

 

3>可执行文件的基本加载过程:第一,操作系统读取可执行文件头部,检查文件的合法性,第二,从头部中读取每个"segment"的虚拟地址,文件地址和属性等,并将它们映射到虚拟空间的相应位置。(如果是静态链接则OS会将控制权交给可执行文件的入口。第三,启动动态链接器(Dynamic Linker)ld.so.第四,将控制权交给动态链接器入口地址,动态链接器开始初始化工作,然后对可执行文件进行动态链接工作,当工作完成之后动态链接器将控制权交给可执行文件的入口地址。

 

4>动态链接器的位置是由elf可执行文件决定

 

5>.interp(解释器)保存的是字符串,也就是可执行文件所需动态链接器的路径Linux里几乎都是/lib/ld-linux.so.2(而这是个软链接。

 

6>动态链接器在Linux下是Glibc的一部分,也属于系统库级别。当系统中的Glibc更新有其他版本,ld-linux.so.2这个软链接就是指向新的软链接,所以可执行文件中无需修改。

 

7>,dynamic结构很经典。是一个结构体,描述所需的动态链接信息

 

8>ldd  elfprogram 查看主程序模块依赖哪些共享库

 

9>导入函数,导出函数

 

10>.dynsym只保存了与动态链接相关的符号。.symtab保存了所有的符号

 

11>静态.strtab符号字符串表。 .dynstr动态符号字符串表(辅助表)。为了加快查找过程,有符号哈希表.hash(可以查看数据结构之哈希函数)

 

12>PIC地址无关  -fPIC 按照跨模块模式之间生成代码

 

13>.rel.text.rel.data.rel.dyn实际上是对数据引用的修正,它所修正的位置位于.got及数据段。而.rel.plt实际上是对函数引用的修正。它所修正的位置位于.got.plt

 

14>.got用来保存全局变量引用地址  .got.plt用来保存函数引用地址  .plt每个外部函数在.plt用有一个相应的项来实现延时跳转。当第一跳转时会将函数地址填入.got.plt

 

原创粉丝点击