Dynamic-Linking
什麼時候需要動態庫
有人告訴我動態庫很好,因為它可以節省 RAM,只有在程序執行時才需要它。
現在我有一個問題:如果一個程序可以執行,我可以說它需要的所有動態庫都在那裡(不會有任何動態庫失去錯誤)?
說一個程序來自三個
.o
文件的連結,每個.o
文件都需要一個動態庫。如果我刪除了一個動態庫,我還能讓程序執行嗎?據我所知,我們有兩種載入動態庫的方法:
- 當我們連結目標文件時載入一個動態庫,例如,
g++ a.cpp -ltest
這裡我們將動態庫連結libtest.so
到我們的程序,如果我們刪除了libtest.so
,我們將無法執行程序。- 使用系統 api 函式載入動態庫:
dlopen
. 在這種情況下,根據我的理解,如果程序的執行沒有觸及 的程式碼dlopen
,我們不會有任何錯誤。如果我是對的,我是否可以說如果程序的執行沒有錯誤,這意味著它需要的所有動態庫都肯定存在?
這基本上取決於動態庫是在程序啟動時載入(這將是 ld.so 的正常行為)還是在首次執行需要它們的程式碼時延遲載入。在第一種情況下,程序將很早就因錯誤而終止。在第二種情況下,它可能根本不執行需要動態庫的程式碼而只是成功執行。第二種情況的一個範例是音頻文件處理程序,它根據文件類型載入音頻編解碼器。如果您沒有安裝 mp3 編解碼器,它可能仍適用於其他文件類型。(muru 的評論指出了一個更深入討論的問題)