您现在的位置是:亿华云 > 系统运维
为什么动态链接库以"错误"的方式被卸载?
亿华云2025-10-04 03:58:35【系统运维】7人已围观
简介当程序启动或加载 DLL 时,加载器将生成该程序/DLL 引用的所有 DLL、该 DLL 的依赖项等的依赖项树。然后,它确定初始化这些 DLL 的正确顺序,以便在初始化它所依赖的所有 DLL 之前,
当程序启动或加载 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发生的,而是通过中间(在本例中为中间函数)发生的。云南idc服务商即使你可以相信返回地址,依赖项也会分配给 MID.DLL 而不是A.DLL。
你可能会问,”什么样的人会写出像中函数这样的函数呢?”。这种中间函数在帮助函数/包装器函数很常见,或者为了提供额外的生存期管理功能(尽管它现在不再这样做了,但是它曾经这样做过)。
第三,有调用 GetModuleHandle 函数的情况。我们看看下面的代码:
我们对 GetModuleHandle 的调用,是否应创建依赖项呢?
另请注意,DLL 之间存在的依赖关系不仅仅是对 LoadLibrary 的调用。例如,如果将回调函数指针传递给另一个 DLL,则就会创建一个反向依赖项。
最后要注意的是,这种隐式依赖关系,就像上面写的那样很难看到,站群服务器一旦你把全局析构函数扔进去,情况就更糟了。例如下面的代码:
DLL 依赖项现在隐藏在 SomethingHolder 类中,当 A.DLL 卸载时,g_SomethingHolder的析构函数将运行并尝试与 B.DLL 通信。随之而来的,是程序的不可预知的行为。
总结尽量不对系统运行行为做出过多的假设,严格按照 MSDN 所说的,老老实实写你的代码,基本不会有大错误。
很赞哦!(77)
相关文章
- 当投资者经过第二阶段的认真学习之后又充满了信心,认为自己可以在市场上叱咤风云地大干一场了。但没想到“看花容易绣花难”,由于对理论知识不会灵活运用.从而失去灵活应变的本能,就经常会出现小赢大亏的局面,结果往往仍以失败告终。这使投资者很是困惑和痛苦,不知该如何办,甚至开始怀疑这个市场是不是不适合自己。在这种情况下,有的人选择了放弃,但有的意志坚定者则决定做最后的尝试。
- 一篇文章带你了解JavaScript htmldom 元素
- 如何成为一名优秀的架构师? 你需要吸取这些经验
- Google内部的Python代码风格指南
- 注册域名要了解几大点?新手有什么方式注册域名?
- Spring中毒太深,离开Spring我居然连最基本的接口都不会写了
- 太牛了,这是我见过SpringCloud微服务架构讲的详细的|附面试题
- SpringSecurity系列之只允许一台设备在线
- 4、企业无形资产:通用网站已成为企业网络知识产权的重要组成部分,属于企业的无形资产,也有助于提升企业的品牌形象和技术领先形象。它是企业品牌资产不可或缺的一部分。
- CI校验不通过,竟然被自己坑死了
热门文章
站长推荐
3、不明先知,根据相关征兆预测可能发生的事件,以便提前做好准备,赶紧注册相关域名。;不差钱域名;buchaqian抢先注册,就是这种敏感类型。预言是最敏感的状态。其次,你应该有眼力。所谓眼力,就是善于从社会上时不时出现的各种热点事件中获取与事件相关的域名资源。眼力的前提是对域名领域的熟悉和丰富的知识。
面试官:说说Webpack的热更新是如何做到的?原理是什么?
别让引入的 SDK 和第三方库导致您应用被下架!
一篇带给你Sentinel 流控原理
4、企业无形资产:通用网站已成为企业网络知识产权的重要组成部分,属于企业的无形资产,也有助于提升企业的品牌形象和技术领先形象。它是企业品牌资产不可或缺的一部分。
深入源码,深度解析Java 线程池的实现原理
教你用Python玩转MySQL
文字烟花特效,用JS代码示爱!程序员小姐姐用这个代码挽回了爱情~