靜態鏈接、裝入時動態鏈接和運行時動態鏈接

實現鏈接的方法有三種:靜態鏈接、裝入時動態鏈接和運行時動態鏈接。

①靜態鏈接

圖5.2.2示出了經編譯後所得到的三個目標模塊A、B、C,他們的長度分別爲 L、M、N。在模塊A中,有

一條語句CALL B,用於調用模塊B。在模塊B中,有一條語句CALL C, 用於調用模塊C。B和C都屬於外部

調用符號,在將這幾個目標模塊鏈接裝配成一個裝入模塊時,需要解決以下兩個問題:

●對相對地址進行修改

通常由編譯程序產生的所有目標模塊,其起始地址都爲0,每個模塊中的地址都是相對於0的。在鏈接成

一個裝入程序後,模塊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去找到該模塊,將它裝入內存,並把它連接到調用者模塊上。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章