程序的鏈接
程式連結概述
連結是將多個目標模組(編譯後的原始碼)合併成一個完整的可執行檔的過程。它不僅包括將目標模組合併,還涉及解決模組之間的位址引用和符號解析。
靜態連結
靜態連結是在程式編譯和產生目標模組之後,在程式執行之前將這些目標模組和所需的函式庫函數合併為一個完整的可執行檔。
- 過程:每個目標模組編譯後,其位址是相對的,通常都是相對於模組的起始位址為0來進行計算。透過連結過程,所有目標模組的起始位址將被調整為實際的記憶體位址。
- 符號解析:靜態連結不僅需要修改各個目標模組中的起始位址,還要解析外部呼叫符號(例如函數呼叫、外部變數等),將它們轉換為實際的記憶體位址。
- 優勢:靜態連結產生的可執行檔通常較為獨立,包含所有需要的函式庫程式碼,因此執行時不依賴外部的共用函式庫或動態函式庫。
裝入時動態連結
裝入時動態連結指的是程式運行時,當作業系統將程式載入到記憶體時,按需進行連結。
- 流程:使用者的目標模組透過裝載程式逐一裝入記憶體。每次裝入目標模組時,若模組依賴其他模組或函式庫,作業系統將自動載入這些依賴,並修改目標模組中的位址引用。
- 優勢:動態連結使得程式可以根據需求載入和連結目標模組,減少了程式的初始載入時間,並允許模組更新和共用。例如,更新某個模組後,只需更新對應的目標模組,而不需要重新編譯整個程式。
運行時動態連結
運行時動態連結指的是在程式執行過程中,當某個模組需要時,作業系統會將其動態載入到記憶體中,並進行連結。
- 過程:這種連結方式通常是由作業系統或執行時間環境在程式執行時處理的。當程式遇到某個尚未載入的目標模組時,作業系統才會將其裝入記憶體並建立連結。這種方式可以顯著提高程式的啟動速度,並節省主存空間。
- 優勢:運行時動態連結最顯著的優點是節省記憶體空間,因為只有在需要時才載入模組。此外,運行時動態連結可以有效地共享公共庫,減少重複載入的情況,提高記憶體使用率。
總結
- 靜態連結:在編譯時完成,產生獨立的可執行文件,不依賴外部模組。缺點是可執行檔較大,且模組更新較為困難。
- 裝入時動態鏈接:程式在加載時動態地解決模組之間的依賴關係,使得模組能夠共享和更新,優於靜態鏈接,但可能會增加加載時間。
- 運行時動態連結:在程式運行時按需載入模組,節省記憶體空間並加快程式啟動速度,但依賴作業系統的支持,且在執行過程中可能會帶來延遲。