动态库载入过程
一直沒(méi)想過(guò)這個(gè)問(wèn)題:C代碼里調(diào)用標(biāo)準(zhǔn)庫(kù)的printf()函數(shù),但是鏈接器在鏈接目標(biāo)文件的時(shí)候并不會(huì)把標(biāo)準(zhǔn)庫(kù)這個(gè)動(dòng)態(tài)庫(kù)鏈接進(jìn)去,動(dòng)態(tài)加載嘛。我們知道代碼里的函數(shù)調(diào)用處這時(shí)應(yīng)該是做一個(gè)引用即可。但是最終執(zhí)行的時(shí)候怎樣才能找到這個(gè)函數(shù)的實(shí)體呢?
其實(shí)想來(lái)也很簡(jiǎn)單:當(dāng)目標(biāo)文件執(zhí)行到庫(kù)函數(shù)調(diào)用處,就把動(dòng)態(tài)庫(kù)加載進(jìn)內(nèi)存,然后通過(guò)函數(shù)的符號(hào)名找到庫(kù)里的函數(shù)指針(符號(hào)表搜索嘍),把它賦值給一個(gè)指針函數(shù),然后把加上參數(shù)調(diào)用之。?
函數(shù)調(diào)用嘛,無(wú)非就是拿到函數(shù)的內(nèi)存地址,然后用函數(shù)指針的類型轉(zhuǎn)換之,加上參數(shù)就可以了。
下邊的鏈接里是個(gè)windows編程的加載、查找函數(shù)和調(diào)用的過(guò)程,linux應(yīng)該也一樣吧,只是這個(gè)過(guò)程編譯器和鏈接器幫你做了。
http://biancheng.dnbcw.info/c/51432.html
歡迎指正!
?
轉(zhuǎn)載于:https://blog.51cto.com/wilburwoo/607095
總結(jié)
- 上一篇: MySQL5日期类型DATETIME和T
- 下一篇: 【android】【转】class an