當前目錄
系統目錄。通過getsystemdirectory 函式可以得到。
16位系統目錄。沒有函式可以獲取該目錄,但它是被搜尋的。windows me/98/95: 目錄不存在
windows目錄。通過getwindowsdirectory 即可得到。
path環境變數中所列目錄。
當應用程式呼叫loadlibrary 或 loadlibraryex 函式時,系統就會嘗試按載入時動態鏈結搜尋次序(參見載入時動態鏈結)定位dll。如果找到,系統就把dll模組對映到程序的虛位址空間中,並增加引用計數。如果呼叫loadlibrary或loadlibraryex 時指定的dll其**已經對映到呼叫程序的虛位址空間,函式就會僅返回dll的控制代碼並增加dll引用計數。注意:兩個具有相同檔名及副檔名但不在同一目錄的dll被認為不是同乙個dll。
系統在呼叫loadlibrary或loadlibraryex的執行緒上下文中呼叫入口點函式。如果已經有程序通過呼叫loadlibrary或loadlibraryex函式載入了dll,且沒有呼叫freelibrary,那麼入口點函式就不會再次呼叫。
如果系統找不到dll,又或者入口點函式返回false,loadlibrary或loadlibraryex將返回null。如果loadlibrary或loadlibraryex呼叫成功,將返回dll模組的控制代碼。程序可以通過該控制代碼標識呼叫getprocaddress、freelibrary或freelibraryandexitthread函式的dll。
getmodulehandle返回的控制代碼可以被getprocaddress、freelibrary或freelibraryandexitthread所使用。只有當dll通重載入時鏈結或前次loadlibrary、loadlibraryex呼叫已經對映到程序的位址空間時,getmodulehandle才會成功。getmodulehandle 不會增加模組的引用計數。getmodulefilename 函式通過getmodulehandle、loadlibrary或loadlibraryex返回的控制代碼獲取所關聯的模組全路徑。
模組可以通過getmodulehandle、loadlibrary或loadlibraryex返回的控制代碼,然後呼叫getprocaddress得到dll中出口函式的位址。
如果不再需要乙個dll模組的話,程序可以呼叫freelibrary或freelibraryandexitthread(來釋放)。這些函式將減少模組的引用計數,並且如果引用計數為0時,將從程序的虛位址空間取消該dll的對映。
使用執行時動態鏈結即使dll不可用的話,程序也能繼續執行,然後程序可以通過乙個變更方法達到最終目的。例如,如果程序不能找到乙個dll,它可以嘗試另外乙個或者向使用者提示錯誤。如果使用者可以提供丟失的dll的全路徑,程序就可以不管是否在正常的搜尋路徑中而使用該路徑資訊。然而如果是載入時鏈結的話,系統就會終止。
使用執行時動態鏈結時,如果dll使用dllmain函式為程序的每個執行緒完成初始化就會產生問題,這是因為執行緒在loadlibrary或loadlibraryex呼叫前入口點函式不被呼叫。關於如何處理該問題的示例,可參照「動態鏈結庫的執行緒區域性儲存」。
動態鏈結 執行時載入dlopen
前面我們在編譯可執行檔案時,如果可執行檔案要依賴某個so。必須要通過 l指定so路徑,並且 l指定so名字。而且在可執行檔案執行時,要先載入so的load部分到程序位址空間。有一種方式可以在編譯時不需要link so,而且程式執行過程中去載入so。dlopen函式可以在程序執行過程中,開啟so,將其...
靜態鏈結 裝入時動態鏈結和執行時動態鏈結
靜態鏈結 經編譯後所得到的三個目標模組a b c,他們的長度分別為 l m n。在模組a中,有 一條語句call b,用於呼叫模組b。在模組b中,有一條語句call c,用於呼叫模組c。b和c都屬於外部 對相對位址進行修改 乙個裝入程式後,模組b和c的起始位址不再是0,而是l和l m,此時需修改b和...
編譯時連線與執行時鏈結及靜態庫鏈結
本地編譯器動態庫編譯時鏈結 l lib usr lib usr local lib 編譯時鏈結的話,能查到libname.so 且這個檔案要不是個link,要不就是實際的動態庫檔案,否則會報錯 說鏈結順序沒有意義,因為並不鏈結到檔案裡面去 注意 不包括ld library path與 etc ld....