Windows下的動態鏈結

2022-06-29 09:33:24 字數 782 閱讀 9816

dll的設計目的與共享物件有些出入,dll更加強調模組化,即微軟希望通過dll機制加強軟體的模組化設計,使得各種模組之間能夠鬆散地組合、重用和公升級。

基位址(base address)和相對位址(rva, relative virtual address)

dll共享資料段

匯出:__declspec(dllexport) 修飾

匯入:__declspec(dllexport) 修飾

通過externel "c"修飾來使用c語言的符號修飾

使用.def檔案中的import和exports段來宣告匯入匯出符號,好處是可以控制符號的符號名。

導入庫(import library):.lib檔案用來描述匯出符號,並不包含**和資料。

dll顯式執行時鏈結

exp檔案:匯出表的臨時檔案

匯出重定向:正常情況下,匯出表的位址陣列中包含的是函式的rva,但是如果這個rva指向的位置位於匯出表中,那麼表示這個符號被重定向了。它是指向乙個ascii的字串,是符號重定向後的dll檔名和符號名。

匯入表:windows將會保證依賴關係的正確和所有的匯入符號都被正確地解析,如果某個模組無法正確載入,系統將會提示錯誤,終止執行該程式。

延遲載入

匯入函式的呼叫

序號匯入函式繫結

使用c++編寫共享庫要複雜的多,並且難以更新。因為c++標準值規定了語言層面的規則,而對二進位制級別卻沒有任何規定。為了解決類似的相容性問題,微軟公司很早就開始了元件物件模型(com,component object model)的開發工作

解決方法:

Windows下的動態鏈結

windows 下的dll 檔案和exe 檔案實際上是乙個概念,它們都是有 pe格式的二進位制檔案,稍微有些不同的是 pe檔案頭部有個符號位表示該檔案是 exe或是 dll,而 dll檔案的副檔名不一定是 dll 也可能是 ocx ocx控制項 或是.cpl 控制面板程式 在elf中,共享庫中所有的...

Windows下動態鏈結庫與靜態鏈結庫的構建

bool winapi dllmain handle hdllhandle,dword dwreason,當乙個程式試圖載入解除安裝dll時,系統會呼叫dll庫中的dllmain函式 然後編寫實際功能函式 libiary win32 dll 模組名稱 exports 下面的函式才能在dll外使用 f...

Windows下gcc編譯鏈結

在windows的dos下實現gcc編譯和鏈結 這裡主要看的是兩篇寫的很詳細的文章 c語言多檔案編譯初探 一 c語言多檔案編譯初探 二 3.此時就可以在dos中使用gcc了。gcc可以將c c 檔案編譯為.o檔案,然後鏈結生成可執行檔案.exe。4.接下來我們寫兩個原始檔,乙個標頭檔案,用來模擬多檔...