靜態鏈結 裝入時動態鏈結和執行時動態鏈結

2021-06-15 05:03:22 字數 1984 閱讀 3536

①靜態鏈結

經編譯後所得到的三個目標模組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....