动态链接的步骤
1. 动态链接器自举
(1)动态链接器本身不依赖任何共享对象
(2)通过一段精巧的启动代码完成自身全局和静态变量的重定位而在过程中又不会用到全局和静态变量
而这个有限制条件的启动代码过程被称为自举
2.将依赖的共享对象映射到进程空间
完成自举后,动态连接器将可执行文件和链接器本身的符号表都合并到一个全局符号表(Global Symbol Table)中,
然后连接器开始寻找执行文件所依赖的共享对象(可执行文件的".dynamic"段中,有一种类型时DT_NEED,它标明了可执行文件所依赖的共享对象)。
由此链接器将按照广度搜索算法(也可以时其他搜索算法)将所有依赖的共享对象的名字放入一个集合容器中,,然后读取相应的ELF文件头和“.dynamic”段,然后
将它相应的代码段和数据段映射到进程空间中。
3. 开始重定位和初始化
完成上述步骤后,所有依赖的共享对象已全部映射到进程空间。链接器开始遍历执行文件和每个共享对象的重定位表(.dynamic段中有重定位表的位置),将它们的GOT/PLT
的每个需要重定位的位置进行修正(GOT/PLT就在.dynamic的下方,且动态链接器已有进程的全局符号表,可以通过它进行修正)
初始化就是在重定位完成以后,如果某个或多个共享对象拥有“.init”段,那么将执行.init段中的代码,完成共享对象特有的初始化过程