靜態連結與動態連結的差異:比較函式庫的結合方式
連結是把編譯後的程式碼與它所使用的函式庫程式碼結合起來的作業。靜態連結會在建置時把所需函式庫的程式碼複製進執行檔,因此程式本身就能獨立運作。動態連結的執行檔只記錄所需的共享函式庫,在程式啟動時由作業系統載入,因此許多程式可以共用同一份副本。靜態連結便於散布,動態連結則能節省記憶體,也更容易更新。
| 項目 | 靜態連結 | 動態連結 |
|---|---|---|
| 何時進行 | 建置時。把函式庫的程式碼複製到執行檔中 | 載入時或執行時。由動態連結器尋找共享函式庫(.so、.dll)並進行對映 |
| 執行檔大小 | 大 | 小 |
| 記憶體使用量 | 每個程式各自持有函式庫程式碼的副本 | 共享函式庫的同一份副本可由多個行程共用 |
| 更新與安全性修補 | 必須重新建置並重新散布程式 | 只要更新一次函式庫就有效,不必重新建置(前提是介面相容) |
| 啟動時間 | 稍快 | 稍慢。需要解析符號(多半會延遲進行) |
| 散布 | 自我完備。即使未安裝函式庫也能執行 | 目標系統需要正確版本的函式庫。沒有的話會啟動失敗 |
| 執行時的成本 | 可進行整個程式的最佳化與直接呼叫 | 經由 GOT 或 PLT 的間接呼叫,有些微負擔 |
| 版本問題 | 執行時不會發生 | 程式與已安裝的函式庫可能不一致 |
| 主要用途 | 嵌入式韌體、單一檔案的工具、最小化的容器 | 通用作業系統上的大部分程式、外掛程式、libc 等系統函式庫 |
數值為具代表性的大致參考值,會因世代或產品而異。