成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

為什么動態鏈接庫以"錯誤"的方式被卸載?

數據庫 其他數據庫
在標記為 “oops” 的行中,不能保證 B.DLL 仍在內存中,因為 B.DLL 不會出現在 A.DLL 的依賴項列表中,即使存在由對 LoadLibrary 的調用導致的運行時生成的動態依賴項。

?當程序啟動或加載 DLL 時,加載器將生成該程序/DLL 引用的所有 DLL、該 DLL 的依賴項等的依賴項樹。然后,它確定初始化這些 DLL 的正確順序,以便在初始化它所依賴的所有 DLL 之前,不會初始化任何 DLL。(當然,如果你有一個循環依賴關系,那么它就會崩潰。眾所周知,從 DLL 的DLL_PROCESS_ATTACH 通知中調用加載庫函數或 LoadLibraryEx 函數也會弄亂這些依賴項的計算過程。)

同樣,當卸載 DLL 或程序終止時,將進行反初始化,以便在 DLL 的所有依賴項之后反初始化該 DLL。

但是,當你手動加載 DLL 時,關鍵信息會丟失:即調用 LoadLibrary 的 DLL 取決于正在被加載的 DLL。因此,如果 A.DLL 手動加載 B.DLL,則不能保證 A.DLL 將在 B.DLL 之前卸載。這意味著,例如,像下面這樣的代碼是不可靠的:

在標記為 “oops” 的行中,不能保證 B.DLL 仍在內存中,因為 B.DLL 不會出現在 A.DLL 的依賴項列表中,即使存在由對 LoadLibrary 的調用導致的運行時生成的動態依賴項。

為什么加載器無法跟蹤此動態依賴項?換句話說,當A.DLL調用LoadLibrary(“B.DLL”) 時,為什么加載器不能自動說“好吧,現在A.DLL依賴于B.DLL”?

首先,因為正如我在之前的文章中所指出的,你不能相信返回地址。

其次,即使你可以相信返回地址,你仍然不能相信返回地址。我們看看下面的代碼:

在這種情況下,B.DLL 的加載不是直接從A.DLL發生的,而是通過中間(在本例中為中間函數)發生的。即使你可以相信返回地址,依賴項也會分配給 MID.DLL 而不是A.DLL。

你可能會問,”什么樣的人會寫出像中函數這樣的函數呢?”。這種中間函數在幫助函數/包裝器函數很常見,或者為了提供額外的生存期管理功能(盡管它現在不再這樣做了,但是它曾經這樣做過)。

第三,有調用 GetModuleHandle 函數的情況。我們看看下面的代碼:

我們對 GetModuleHandle 的調用,是否應創建依賴項呢?

另請注意,DLL 之間存在的依賴關系不僅僅是對 LoadLibrary 的調用。例如,如果將回調函數指針傳遞給另一個 DLL,則就會創建一個反向依賴項。

最后要注意的是,這種隱式依賴關系,就像上面寫的那樣很難看到,一旦你把全局析構函數扔進去,情況就更糟了。例如下面的代碼:

DLL 依賴項現在隱藏在 SomethingHolder 類中,當 A.DLL 卸載時,g_SomethingHolder的析構函數將運行并嘗試與 B.DLL 通信。隨之而來的,是程序的不可預知的行為。

總結

盡量不對系統運行行為做出過多的假設,嚴格按照 MSDN 所說的,老老實實寫你的代碼,基本不會有大錯誤。

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2024-06-06 08:53:13

動態鏈接庫共享庫

2012-05-04 08:24:14

LinuxUnix

2012-05-08 14:48:23

LinuxUnix動態鏈接庫

2011-06-21 18:02:14

Qt 動態 鏈接庫

2009-07-07 20:57:20

LinuxUnix動態鏈接庫

2009-08-28 16:19:30

C#實現修改動態鏈接庫

2022-06-09 09:54:45

編譯軟件開發

2022-05-03 23:44:21

Python動態鏈接庫Ctypes

2024-03-01 20:59:11

C#DLL開發

2011-05-18 17:15:45

2023-11-29 08:31:20

PythonRust

2009-08-05 16:29:18

C#調用C++動態鏈接

2023-05-09 08:24:11

JNA鏈接庫代碼

2009-10-29 16:36:49

VB.NET .DLL

2022-08-09 07:57:25

Linux操作系統Windows

2022-07-12 13:23:59

靜態鏈接庫可執行文件C 目標文件

2011-08-02 14:15:05

XCode 靜態 鏈接庫

2021-09-01 05:11:13

C# 動態鏈接庫

2011-09-06 16:30:32

iOS系統靜態鏈接庫

2012-01-06 10:25:50

JavaDLLC++
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 男人天堂免费在线 | 九九亚洲精品 | 99福利视频 | 极品国产视频 | 777zyz色资源站在线观看 | 国产精品2| 欧美专区在线 | 91久色| 美女视频h| 精品一区二区久久久久久久网站 | 阿v视频在线观看 | 久久精品国产清自在天天线 | 嫩草国产 | 91精品中文字幕一区二区三区 | 综合久| 免费观看av网站 | 久久精品亚洲国产奇米99 | 精品美女视频在免费观看 | 精国产品一区二区三区 | 日韩高清国产一区在线 | 在线黄av | 国产乱码精品一区二区三区忘忧草 | 一区二区三区四区av | 99色在线视频 | 亚洲视频一区在线 | 噜啊噜在线 | 免费精品| 综合伊人 | 一区二区三区国产视频 | 国产激情毛片 | 亚洲一区二区三区观看 | 国产乱码精品一品二品 | 久久久五月天 | 亚洲乱码一区二区三区在线观看 | 99视频在线| 看a网站 | 欧美日本一区二区 | 成人久久 | 亚洲www啪成人一区二区 | 国产精品99久久久久久宅男 | 日韩av一区二区在线观看 |