- 動(dòng)態(tài)鏈接與靜態(tài)鏈接的區(qū)別
- 靜態(tài)鏈接庫、動(dòng)態(tài)鏈接庫、導(dǎo)入庫的區(qū)別
- Linux下的靜態(tài)庫、動(dòng)態(tài)庫和動(dòng)態(tài)加載庫
總結(jié):并沒有找到動(dòng)態(tài)鏈接與動(dòng)態(tài)加載的明顯區(qū)別,但動(dòng)態(tài)鏈接與靜態(tài)鏈接的區(qū)別是明顯的:
一個(gè)是編譯時(shí)就鏈接進(jìn)可執(zhí)行文件,一個(gè)是執(zhí)行時(shí)才鏈接。
靜態(tài)重定位
- 重定位時(shí),取重定位項(xiàng),加上重定位因子得到欲修改位置的實(shí)際地址。
- 優(yōu)點(diǎn):無須硬件支持
- 缺點(diǎn):程序重定位以后就不能在內(nèi)存中移動(dòng)。要求程序的存儲(chǔ)空間是連續(xù)的,不能把程序存儲(chǔ)到若干個(gè)不連續(xù)的區(qū)域中。
動(dòng)態(tài)重定位
- 當(dāng)CPU取一條訪問內(nèi)存的指令時(shí),地址變換硬件將指令中的相對(duì)地址與重定位寄存器中的值 相加,再根據(jù)和值去訪問該單元的數(shù)據(jù)。
- 裝配模塊不加任何修改就裝入內(nèi)存
- 需要硬件(重定位寄存器)的支持
靜態(tài)鏈接、動(dòng)態(tài)鏈接
- 靜態(tài)鏈接
- 動(dòng)態(tài)鏈接(dll)
- 裝入時(shí)鏈接
- 運(yùn)行時(shí)鏈接
裝入時(shí)鏈接:
- 用一個(gè)動(dòng)態(tài)導(dǎo)入表保存需要使用的dll文件和dll中的函數(shù)。
- 裝入時(shí)檢根據(jù)動(dòng)態(tài)導(dǎo)入表依次裝入每個(gè)動(dòng)態(tài)庫。
運(yùn)行時(shí)鏈接:
- 用API函數(shù)LoadLibrary或LoadLibraryEx函數(shù)來裝入動(dòng)態(tài)庫(共享引用計(jì)數(shù)增加1)
- 通過GetProcAddress函數(shù)來獲得函數(shù)的地址,并且傳遞給函數(shù)相應(yīng)的參數(shù),調(diào)用這個(gè)函數(shù)。
- 在動(dòng)態(tài)庫用完后,可通過FreeLibrary函數(shù)來釋放動(dòng)態(tài)庫資源(共享引用計(jì)數(shù)減1)。