读《程序员的自我修养》有感---动态连接

    上篇说了可执行文件的静态连接,此次谈谈动态连接的一些要点。程序员

    动态连接基本有2种装载方式:进程

  1. 覆盖装载:两个无依赖关系的模块以不一样顺序装载进入同一个地址空间
  2. 页映射:将虚拟地址空间分红多个页面(4096字节/页),同时文件段也分红页,造成文件页---虚拟页的映射关系

    由于有了页映射,空间利用率提升了很多,同时可执行文件的装载过程也是紧密地依靠着页映射。下图表示了可执行文件的装载过程。编译

    在页映射带来便利的同时,也带来了许多问题,页映射的方便使得动态连接和静态连接有很大的不一样。其中,动态连接拥有几个独有的技巧:变量

  1. 装载时重定位:装载时才肯定模块的装载地址,以后才重定位对绝对地址的引用
  2. 地址无关代码:将模块中那些须要修改指令部分分离出来,与数据部分合并在一块儿,经过GOT(Global Offset Table)访问
  3. 共享模块的全局变量:ELF共享库在编译时,默认此类变量为定义在其余模块的全局变量,因此每一个进程都独享共享库的数据段副本

    针对这些动态连接这些特色,动态连接器须要一些特定的操做,好比在最开始时他不能依赖任何共享库,其次它也不能引用任何全局/静态变量,而且此类变量的重定位工做还须要动态连接器完成。下图粗略地表示出动态连接的过程:技巧

   

    在动态连接中,Windows和Linux有特殊的不一样点,尤为在《程序员的自我修养》中有过说起,在此强调一下,以理清其中的思路。引用

 

相关文章
相关标签/搜索