【问题标题】:Does windows ensure that memory will contain only one copy the same dll as in linux?windows 是否确保内存只包含一个与 linux 中相同的 dll 副本?
【发布时间】:2011-06-11 05:09:45
【问题描述】:

我一直认为 .dll 在 linux 中的工作方式与 .so 相同,

但有些文章说不是。

windows 是否确保内存只包含一个与 linux 中相同的 dll 副本?

我不知道自己在windows中查看,所以只能在这里问。

更新

有人知道如何手动验证吗?

【问题讨论】:

标签: windows dll shared-libraries


【解决方案1】:

这里有一个简短的描述:DLL Hell,基本上在现代 Windows 中,它使用一种称为内存映射的技术,其中 DLL 被加载一次,如果两个进程都尝试从同一目录加载 DLL。因此,要回答您的问题,它的工作原理与 Linux 相同。

【讨论】:

  • 好像windows是通过dll的固定地址来支持的,不支持PIC,所以效果有限,可能只针对自己的dll吧?
  • 这已成为过去,DLL 中的固定地址在现代 Windows(Win2000 及更高版本)中没有多大作用。
  • @Haukman,你有办法手动验证吗(否则你怎么这么有信心)?
  • 实际上很难证明这一点,您必须运行低级调试器并查看页面映射到的物理内存。但这是微软在早期 Windows(如版本 3)中的 DLL Hell 之后所做的“已知”技术。以下是一些信息:flounder.com/hooks.htm
  • 我不相信不能轻易证明的东西。
【解决方案2】:

如果 DLL 可以在两个进程中加载​​到相同的虚拟基地址,那么物理内存中将只有一个 DLL 副本。

由于 Windows 不使用与位置无关的代码,如果 DLL 无法在其首选基地址加载,它将被重新定位,因此无法与其他实例共享物理内存。

【讨论】:

  • 那么内存中是否有多个副本是随机的?
  • 没有。不是随机的。您选择一个不会与其他 DLL 冲突的基地址。
  • @David Heffernan,不,你永远不能保证,对吗?
  • 如果您知道您的进程将加载哪些 dll,那么您可以轻松避免冲突。我想我现在已经回答了你的问题。
  • @compile-fan 不听答案为什么还要问这个问题?显然,您对 Windows 的评价很低,并且已经决定要相信什么。显然,您不能使用网络搜索来阅读这个文档丰富的主题。即使你可以,如果它与你预先确定的信念不符,你也会不相信所写的内容。基于信仰的学习是无效的。我简洁准确地回答了你的问题。为什么你不能承认这一点?
猜你喜欢
  • 1970-01-01
  • 2018-01-23
  • 2017-08-13
  • 1970-01-01
  • 2012-09-15
  • 2016-12-08
  • 2021-01-03
  • 2016-10-13
  • 2015-07-14
相关资源
最近更新 更多