Dynamic-Linking

什麼時候需要動態庫

  • April 17, 2018

有人告訴我動態庫很好,因為它可以節省 RAM,只有在程序執行時才需要它。

現在我有一個問題:如果一個程序可以執行,我可以說它需要的所有動態庫都在那裡(不會有任何動態庫失去錯誤)?

說一個程序來自三個.o文件的連結,每個.o文件都需要一個動態庫。如果我刪除了一個動態庫,我還能讓程序執行嗎?

據我所知,我們有兩種載入動態庫的方法:

  1. 當我們連結目標文件時載入一個動態庫,例如,g++ a.cpp -ltest這裡我們將動態庫連結libtest.so到我們的程序,如果我們刪除了libtest.so,我們將無法執行程序。
  2. 使用系統 api 函式載入動態庫:dlopen. 在這種情況下,根據我的理解,如果程序的執行沒有觸及 的程式碼dlopen,我們不會有任何錯誤。

如果我是對的,我是否可以說如果程序的執行沒有錯誤,這意味著它需要的所有動態庫都肯定存在?

這基本上取決於動態庫是在程序啟動時載入(這將是 ld.so 的正常行為)還是在首次執行需要它們的程式碼時延遲載入。在第一種情況下,程序將很早就因錯誤而終止。在第二種情況下,它可能根本不執行需要動態庫的程式碼而只是成功執行。第二種情況的一個範例是音頻文件處理程序,它根據文件類型載入音頻編解碼器。如果您沒有安裝 mp3 編解碼器,它可能仍適用於其他文件類型。(muru 的評論指出了一個更深入討論的問題)

引用自:https://unix.stackexchange.com/questions/438232