- 动态链接重要的特性就是共享,地址无关码,延迟绑定。
- 动态链接本质上进行的是装载时重定位,同时完成了代码的不同进程之间共享。
- 装载时重定位是解决动态模块中有绝对引用的方法之一,但是它有一个很大的缺点是指令部分无法在多个进程之间共享。其实我们的目的很简单,希望程序模块中共享的指令部分在装载时不需要因为装载地址的改变而改变,所以实现的基本方法是把指令中那些需要被修改的部分分离出来跟数据部分放在一起,而数据部分在每个进程中拥有一个副本。 (此时的数据部分包含了需要被修改的一些代码)                                                                                                                                       ----地址无关码技术
- 地址无关码技术用在共享对象上。此时该共享对象是没有代码段重定位表的。地址无关指的是与装载的地址无关。
- 对于数据段(此时的数据段:指位于共享对象中的数据不含代码)来说,它在每个进程中都拥有一个独立的副本,我们可以选择装载时重定位的方式解决数据段中绝对地址的引用问题。
 
- 动态链接存在一些性能问题。优化性能的方式如延迟绑定等。
- 延迟绑定:当函数第一次被调用到时才进行绑定。为了实现延迟绑定,在GOT的基础上增加了一层间接跳转。调用函数通过一个叫PLT的项来跳转。第一次跳转到该函数时,会进行该函数的符号解析和重定位工作。以后调用会直接调用到该函数。
- 动态链接的一些相关结构:保存链接器路径的.interpret,动态链接下的一个“文件头”,动态符号表,动态链接重定位表。
- 如果一个共享对象不是PIC模式编译的,那么肯定需要在装载时重定位,使用了PIC模式的编译,代码段不需要重定位因为地址无关,但是数据段仍需要。
- 动态链接加载目标文件类似图的广度遍历。
- 全局符号介入:当一个符号需要加入全局符号表时,如果相同的符号名已经存在,则后加入的符号被忽略。依据这一特征,模块内部的函数调用也被当成模块间的函数调用。(或者将内部函数声明为static)。
- 对于内部外部的全局变量或者函数都是通过GOT。GOT本身在数据段,PLT本身在代码段。
 
- 进程会在进程堆栈中保存一些初始化信息,交出控制权给动态链接器,链接器会进行自举,然后载入目标文件,重定位和初始化。
 
             
            posted @ 
2023-02-26 16:44 
stu--wy 
阅读(
66) 
评论() 
 
收藏 
举报