我開始以為動態鏈結器
ld-linux.so.x
是linux
核心的一部分,其實這種想法是錯誤的。
分析完elf可執行檔案在核心中載入啟動的原始碼後,可以參考博主的這兩篇部落格
linux載入啟動可執行程式的過程(一)核心空間載入elf的過程
linux載入啟動可執行程式的過程(二)直譯器完成動態鏈結
我們可以知道,識別二進位制映像以及檔案對映到程序虛擬位址空間這個過程確實是在核心中完成的,但是動態鏈結的過程,需要把控制權交給ld-linux.so.x,這是在使用者空間進行的。由此可見,我們的程式在被核心載入到記憶體,核心跳到使用者空間後並不是執行目標程式的,而是先把控制權交到使用者空間的動態鏈結器,由動態鏈結器載入執行使用者程式所需要的動態庫(比如libc.so.x等等),然後控制權才會轉移到使用者程式。
這樣就好理解了:如果通過gcc生成elf可執行檔案,那麼會呼叫到glibc的函式庫,要動態呼叫glibc函式,當然不是在核心中能完成的事情了。再者,ld-linux.so.x是glibc安裝的庫,所以動態鏈結的過程實際上這跟編譯一樣,屬於使用者態程式,核心**在elf/rtld.c中。
1.編譯目標**時指定的動態庫搜尋路徑;
2.環境變數ld_library_path指定的動態庫搜尋路徑;
3.配置檔案/etc/ld.so.conf中指定的動態庫搜尋路徑;
4.預設的動態庫搜尋路徑/lib;
5.預設的動態庫搜尋路徑/usr/lib。
linux動態鏈結
在程式中總會用到各式各樣的庫,有兩種使用方式 靜態鏈結庫和動態鏈結庫,在windows下分別對應.lib檔案和.dll檔案,使用靜態庫時需要包含對應的標頭檔案並引用lib檔案,使用動態庫則需要手動通過函式載入dll中的函式。linux下使用方法則有所不同,linux下.a檔案.so檔案分別對應靜態和...
鏈結器之靜態鏈結與動態鏈結
一 前言 二 鏈結 在 深入理解計算機系統 一書中,p448,鏈結的定義是 將各種 和資料部分收集起來並組合為乙個單一檔案的過程,這個檔案可被載入 或被拷貝 到儲存器並執行。這是定義,那麼實際中呢?鏈結的過程就是將.cpp對應的.obj windows下 和.lib 其內部也是一組.obj,即一組可...
Linux動態鏈結之三 動態鏈結相關結構
無論是靜態鏈結還是動態鏈結,初始都是作業系統讀取可執行檔案的file header,以檢查檔案格式 操作許可權等屬性,然後根據段表獲取各個 segment 的vma虛擬裝載位置 檔案位址和操作屬性rwxp等,再根據相似屬性原則相連原則完成裝載,而後將控制權交給檔案頭結構中e entry入口位址 el...