1. 程式人生 > >程式的連結的三種方式

程式的連結的三種方式

程式的連結有以下三種方式:
靜態連結:在程式執行之前,先將各目標模組及它們所需的庫函式連結成一個完整的可執行程式,以後不再拆開。
裝入時動態連結:將使用者源程式編譯後所得到的一組目標模組,在裝入記憶體時,釆用邊裝入邊連結的連結方式。
執行時動態連結:對某些目標模組的連結,是在程式執行中需要該目標模組時,才對它進行的連結。其優點是便於修改和更新,便於實現對目標模組的共享。

記憶體的裝入模組在裝入記憶體時,同樣有以下三種方式:

1) 絕對裝入。在編譯時,如果知道程式將駐留在記憶體的某個位置,編譯程式將產生絕對地址的目的碼。絕對裝入程式按照裝入模組中的地址,將程式和資料裝入記憶體。由於程式中的邏輯地址與實際記憶體地址完全相同,故不需對程式和資料的地址進行修改。

絕對裝入方式只適用於單道程式環境。另外,程式中所使用的絕對地址,可在編譯或彙編時給出,也可由程式設計師直接賦予。而通常情況下在程式中釆用的是符號地址,編譯或彙編時再轉換為絕對地址。

2) 可重定位裝入。在多道程式環境下,多個目標模組的起始地址通常都是從0開始,程式中的其他地址都是相對於起始地址的,此時應釆用可重定位裝入方式。根據記憶體的當前情況,將裝入模組裝入到記憶體的適當位置。裝入時對目標程式中指令和資料的修改過程稱為重定位,地址變換通常是在裝入時一次完成的,所以又稱為靜態重定位,如圖 A所示。
這裡寫圖片描述
靜態重定位的特點是在一個作業裝入記憶體時,必須分配其要求的全部記憶體空間,如果沒有足夠的記憶體,就不能裝入該作業。此外,作業一旦進入記憶體後,在整個執行期間不能在記憶體中移動,也不能再申請記憶體空間。

3) 動態執行時裝入,也稱為動態重定位,程式在記憶體中如果發生移動,就需要釆用動態的裝入方式。裝入程式在把裝入模組裝入記憶體後,並不立即把裝入模組中的相對地址轉換為絕對地址,而是把這種地址轉換推遲到程式真正要執行時才進行。因此,裝入記憶體後的所有地址均為相對地址。這種方式需要一個重定位暫存器的支援,如上圖B所示。

動態重定位的特點是可以將程式分配到不連續的儲存區中;在程式執行之前可以只裝入它的部分程式碼即可投入執行,然後在程式執行期間,根據需要動態申請分配記憶體;便於程式段的共享,可以向用戶提供一個比儲存空間大得多的地址空間。