2014-01-19 144 views
2

據我所知 動態加載意味着在加載或運行時加載庫(或任何其他二進制文件)到內存中。所以在下面的程序中,當dlopen()稱爲動態加載程序將進入圖片並且它會將lib加載到內存中,如果庫尚未加載。動態鏈接和動態加載有什麼區別

動態鏈接是指在加載或運行期間完成的鏈接。並解決外部參考。 所以在下面的程序中,dlsym()函數將要求餘弦函數,並且動態鏈接將出現在圖片中並且符號將被解析。

int main(int argc, char **argv) { 
    void *handle; 
    double (*cosine)(double); 
    char *error; 

    handle = dlopen ("/lib/libm.so.6", RTLD_LAZY); 
    if (!handle) { 
     fputs (dlerror(), stderr); 
     exit(1); 
    } 

    cosine = dlsym(handle, "cos"); 
    if ((error = dlerror()) != NULL) { 
     fputs(error, stderr); 
     exit(1); 
    } 

回答

1

動態加載指在負載或運行時加載所述程序庫(或任何其他二進制爲此事)到存儲器中。

動態加載可以想像爲類似於插件,即一個exe動態加載發生之前能夠實際執行(例如動態加載可使用在C或C LoadLibrary調用++被創建)

動態鏈接指的是在加載或運行時完成的鏈接,而不是在創建exe時。

如果在創建exe時動態鏈接鏈接程序的工作量最小。對於動態鏈接程序來說,它實際上也必須加載庫。因此它也被稱爲鏈接加載程序。

5

這兩個術語都是相似的,它們指的是推遲確定要使用的確切庫,直到程序運行,但已表示不同的方面。

動態加載發生在顯式加載庫時(例如使用dlopen()),而動態鏈接發生時,動態鏈接的可執行文件被加載並由操作系統隱式處理。目的是不同的。

在第一種情況下,動態加載庫用於解析來自不同庫的符號,這些庫是可選的或者具有互斥的符號,並且只有在程序運行之前才能確定要使用的庫。

例如,程序可以根據配置文件的內容確定它需要與特定數據庫進行交互,並且只有在讀取了配置文件後才需要加載數據庫特定庫。它需要等待配置文件在運行時解析,然後調用dlopen()。或者,動態鏈接的可執行文件(如大多數可執行文件所示)將在鏈接時確定所需庫的列表,並且在程序開始在運行時執行之前,這些庫將自動解析。該選項與加載靜態鏈接的可執行文件相反,主要是爲了節省內核內存和可執行文件的大小,因爲只需要內核爲所有使用該庫的可執行文件加載庫一次。您可以在動態鏈接的可執行文件上運行程序ldd以確定所有必需的庫。

+0

根據我的知識,ldd命令用於打印共享庫依賴關係,因此通過動態鏈接實現對共享庫的訪問。因此,所有必需的共享庫(如** libc **)在程序開始執行之前確定並解析被稱爲動態鏈接,我對嗎? – gauramit87

相關問題