天天看點

動态庫的查找過程

轉自http://www.linuxsir.org/bbs/thread299812.html

From:linuxsir Author: scutan

 [1]首先檢視 .dynamic 段是否包含了一個叫DT_RPATH的項(它是一個以冒号分隔的庫檔案搜尋目錄清單)。這個項是在程式被連接配接器連接配接時,由指令行開關或者環境變量添加上去的。它常應用于子系統中,比如像資料庫應用,我們要裝載一些程式集合以及支援庫到一個目錄中去的時候。

 [2]檢視是否存在環境變量 LD_LIBRARY_PATH(它是一個以冒号分隔的庫檔案搜尋目錄清單)。這個項可以幫助開發者建立一個新版本的庫,把他的路徑添加到LD_LIBRARY_PATH中,把它和現存的可連接配接程式一同使用,用來測試新的庫,

 [3]連接配接器檢視庫高速緩存檔案 /etc/ld.so.conf ,它包含了庫名和路徑的一個對應清單,如果庫名存在,連接配接器就使用它對應的路徑,用這個查找方法能夠找到大部分的庫(檔案名不需要和要求完全符合,這點可以參考接下來的“庫的版本”)。

 如果上叙的查找都失敗,連接配接器就查找預設路徑 /usr/lib ,如果庫檔案依舊沒有找到,則顯示一個錯誤然後退出。

連接配接器找到了庫檔案後,先打開它,然後讀取ELF頭,找到指向各個段的指針。連接配接器為庫的代碼段和資料段配置設定空間并映射到記憶體,随後是bss(不配置設定空間)。.通過庫的 .dynamic 段,連接配接器添加這個庫的符号表到符号表鍊,如果庫所依賴的其它庫沒有裝載的話,則添加那個庫到裝載隊列中。