【问题标题】:.NET assemblies and DLL rebasing.NET 程序集和 DLL 变基
【发布时间】:2008-12-09 11:54:19
【问题描述】:

根据this article,由于代码的 JIT 编译,.NET 程序集不需要变基。文章称:

“JIT 编译的代码没有变基问题,因为地址是在运行时根据代码在内存中的位置生成的。此外,MSIL 很少受到基地址未命中的影响,因为 MSIL 引用是令牌-based,而不是基于地址。因此,当使用 JIT 编译器时,系统对基地址冲突具有弹性。"

但是,我注意到 VS2008 将默认的 0x0400000 基地址分配给所有程序集(项目属性 > 构建 > 高级),如果我为我的进程执行 listdlls /r,我的所有 .NET 程序集实际上都是默认重新设置的。

如果我自己分配地址,则不会进行变基。

我的问题是:在这种情况下,什么是 rebase 以及为什么?

编辑:我应该补充一点,我不是在谈论 NGen 的程序集。

【问题讨论】:

    标签: .net assemblies rebasing base-address


    【解决方案1】:

    CLR 加载机制在幕后使用 LoadLibrary,因此您观察到:不能在同一地址加载 2 个程序集。现在人们在尝试重新设置 dll 时通常的意思是避免性能下降。修复命中,例如绝对地址和函数调用需要使用加载的基地址“重新定位”。 CLR 没有这个问题(不确定应用程序中的静态数据,这是修复的第二部分,我需要阅读此内容),因为 MSIL 代码是在调用函数时按需加载的在托管代码中。然后 MSIL 被 jitted 放在堆上,我相信这与普通对象堆不同,CLR 在您的应用程序中分配和布局新对象的方式相同。

    【讨论】:

    • 我知道没有理由进行修复,但由于我们是从网络驱动器加载程序集,由于 rebase 的复制到 pagefile 部分,rebase 可能会成为一个问题。任何带有详细信息的链接将不胜感激。谢谢。
    • AFAIK,复制到页面文件是这些修复的直接结果,因为具有可执行代码的页面对进程变得可写/私有,因此操作系统不能再直接从 dll 重新加载它们。你是这个意思吗?
    • 在 13 年前,msdn.microsoft.com/en-us/library/ms810432.aspx 上有一篇关于变基(本机代码)的旧(似乎来自中年)但仍然很有价值的文章。
    【解决方案2】:

    您正在运行什么操作系统?我知道 vista 及更高版本引入了 ASLR,它随机化了它加载 dll 的地址空间。系统 dll 会发生这种情况,但不确定 .net - 可能需要研究一下。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-04
      • 1970-01-01
      • 2011-06-05
      • 2014-02-27
      • 1970-01-01
      相关资源
      最近更新 更多