讀《程序員的自我修養》有感---動態連接

    上篇說了可執行文件的靜態連接,此次談談動態連接的一些要點。程序員

    動態連接基本有2種裝載方式:進程

  1. 覆蓋裝載:兩個無依賴關係的模塊以不一樣順序裝載進入同一個地址空間
  2. 頁映射:將虛擬地址空間分紅多個頁面(4096字節/頁),同時文件段也分紅頁,造成文件頁---虛擬頁的映射關係

    由於有了頁映射,空間利用率提升了很多,同時可執行文件的裝載過程也是緊密地依靠着頁映射。下圖表示了可執行文件的裝載過程。編譯

    在頁映射帶來便利的同時,也帶來了許多問題,頁映射的方便使得動態連接和靜態連接有很大的不一樣。其中,動態連接擁有幾個獨有的技巧:變量

  1. 裝載時重定位:裝載時才肯定模塊的裝載地址,以後才重定位對絕對地址的引用
  2. 地址無關代碼:將模塊中那些須要修改指令部分分離出來,與數據部分合並在一塊兒,經過GOT(Global Offset Table)訪問
  3. 共享模塊的全局變量:ELF共享庫在編譯時,默認此類變量爲定義在其餘模塊的全局變量,因此每一個進程都獨享共享庫的數據段副本

    針對這些動態連接這些特色,動態連接器須要一些特定的操做,好比在最開始時他不能依賴任何共享庫,其次它也不能引用任何全局/靜態變量,而且此類變量的重定位工做還須要動態連接器完成。下圖粗略地表示出動態連接的過程:技巧

   

    在動態連接中,Windows和Linux有特殊的不一樣點,尤爲在《程序員的自我修養》中有過說起,在此強調一下,以理清其中的思路。引用

 

相關文章
相關標籤/搜索