Compiling
靜態庫:原始碼的重新編譯和共享
我正在嘗試使用Program Library HOWTO了解 Linux 中靜態庫和共享庫的創建和使用。連結中有兩個令我感到困惑的陳述:
- 靜態庫允許使用者連結到程序而無需重新編譯其程式碼,從而節省重新編譯時間。
- 如果開發人員希望允許程序員連結到他們的庫,但又不想提供庫原始碼,那麼靜態庫通常對開發人員很有用。
關於 1:靜態庫最終成為執行檔的一部分,而共享庫保持獨立,僅在執行檔開始執行時載入。但是,這兩個庫是否都具有在新應用程序想要使用它們時不必重新編譯的優點 - 假設庫本身沒有更改?如果這是真的,為什麼該聲明給人的印像是靜態庫優於共享庫?
關於 2:再一次,這是否也適用於共享庫?共享庫也使用對象文件,即使它們以特定於體系結構的格式生成為 PIC。那麼,在這種情況下是否共享原始碼?
我認為該指南應該按照其呈現的順序來理解,而不假設有關圖書館的外部知識。因此在第 2 章“靜態庫”中,比較不涉及尚未介紹的共享庫。
因此,這兩個摘錄都只是與原始碼的比較:與提供原始碼相比,建構靜態庫允許重新使用編譯對象而無需重新編譯,甚至無需提供其原始碼。
摘錄不清楚。
靜態庫成為執行檔的一部分,並且在該執行檔之外不可用。見
man ld
。它們被視為外部函式。靜態連結的執行檔比動態連結的執行檔大,但它們是完整的。自給自足。使用動態連結庫時,程序提供庫名稱。所需的版本等。請參見
man elf readelf
當程序被載入時ld.so
(參見man ld.so
),動態連結庫被映射到任務的記憶體中(參見man mmap
),並設置了一個間接呼叫表,以便程序可以訪問該庫。動態連結庫讓系統在所有任務之間共享 1 個庫的記憶體副本。動態庫的使用使執行檔更小,並將保持庫的最新狀態委託給系統管理員。但是,如果所需的庫和版本不可用,則在執行時解析庫可能會失敗。它們既不完整也不自給自足。