①靜態鏈結
經編譯後所得到的三個目標模組a、b、c,他們的長度分別為 l、m、n。在模組a中,有
一條語句call b,用於呼叫模組b。在模組b中,有一條語句call c, 用於呼叫模組c。b和c都屬於外部
●對相對位址進行修改
乙個裝入程式後,模組b和c的起始位址不再是0,而是l和l+m,此時需修改b和c中的相對位址,即模組
b中的所有相對位址加上l,模組c中的相對位址都加上l+m。
●變換外部呼叫符號
即將每個模組中所用的外部呼叫符號,都變換為相對位址,如把b的起始位址變換為l;c的起始位址變
換為l+m。這種先進行鏈結所形成的乙個完整的裝入模組,又稱為可執行檔案。
通常都不要拆開它,要執行時可直接將它裝入記憶體。這種事先進行鏈結,以後不再拆開的鏈結方式,稱為
靜態鏈結方式。
②裝入時動態鏈結(load-time dynamic linking)
使用者源程式經編譯後所得到的目標模組,是在裝入記憶體時,邊裝入邊鏈結的.即在裝入乙個目標模組時,若
發生乙個外部模組呼叫,將引起裝入程式去找出相應的外部目標模組,並將它裝入記憶體,還要修改目標模
●便與軟體版本的修改和更新
在採用裝入時動態鏈結方式時,要修改或更新各個目標模組,是件非常容易的事,但對於經靜態鏈結以
裝配在一起的裝入模組,如果要修改或更新其中的某個目標模組時,則要求重新開啟裝入模組,這不僅
是低效的,而且有時是不可能的。
●便於實現目標模組共享
若採用裝入時動態鏈結方式,os能夠將乙個目標模組鏈結到幾個應用模組,即實現多個應用程式對該模
塊的共享;然而,採用靜態鏈結方式時每個應用模組都必須含有該目標模組的拷貝,否則無法實現共享。
③執行時動態鏈結(run –time dynamic linking)
雖然前面所介紹的動態裝入方式,可將乙個裝入模組裝入到記憶體的任何地方,但裝入模組的結構是靜態
的,它主要表現在兩個方面:一是在程序的整個執行期間,裝入模組不改變;再者是每次執行時的裝
入模組都是相同的。實際上,在許多情況下,每次要執行的模組可能是不相同的,但由於事先無法知道
本次要執行哪些模組,故只能是將所有可能要執行到的模組,在裝入時全部鏈結在一起,是每次執行時
的裝入模組是相同的。顯然這是低效的。因為這樣,在裝入模組的執行過程中,往往會有某些目標模組
根本就不執行。比較典型的例子是錯誤處理模組,如果程式在整個執行過程中,都不出現錯誤,便不會
用到該模組。
能有效的改變這種情況的鏈結方式,是最近幾年流行起來的執行時動態鏈結方式。這種鏈結方式,可將
某些目標模組的鏈結,推遲到執行時才進行。即在執行過程中,若發現乙個被呼叫模組尚未裝入記憶體時
,由os去找到該模組,將它裝入記憶體,並把它連線到呼叫者模組上。
何謂裝入時動態鏈結,裝入時動態鏈結有何優點?
裝入時動態鏈結是指 使用者源程式編譯後,得到一組目標模組,在裝入記憶體時,採用邊裝入,邊鏈結的方式。即在裝入乙個目標模組時,若發生乙個外部模事件,將引起裝入程式去找出相應的外部目標模組,並將他裝入記憶體。優點主要分為兩點 1 便於修改和更新 對於靜態鏈結,如果需要修改獲更新某個目標模組,需要重新開啟...
動態鏈結 執行時載入dlopen
前面我們在編譯可執行檔案時,如果可執行檔案要依賴某個so。必須要通過 l指定so路徑,並且 l指定so名字。而且在可執行檔案執行時,要先載入so的load部分到程序位址空間。有一種方式可以在編譯時不需要link so,而且程式執行過程中去載入so。dlopen函式可以在程序執行過程中,開啟so,將其...
編譯時連線與執行時鏈結及靜態庫鏈結
本地編譯器動態庫編譯時鏈結 l lib usr lib usr local lib 編譯時鏈結的話,能查到libname.so 且這個檔案要不是個link,要不就是實際的動態庫檔案,否則會報錯 說鏈結順序沒有意義,因為並不鏈結到檔案裡面去 注意 不包括ld library path與 etc ld....