在 Windows Server 2003 上,我的应用程序在全新安装时开始需要很长时间才能加载。怀疑 DLL 没有加载到它们的首选地址,这需要一些时间(应用程序有 100 多个 DLL,包括第 3 方)我运行了 sysinternals listDLLs 实用程序,要求它标记每个已重定位的 dll。奇怪的是,对于列表中的大多数 DLL,我得到如下内容:
Base Size Path
### Relocated from base of 0x44e90000:
0x44e90000 0x39000 validation.dll
也就是说:它们被标记为重定位(加载时间似乎肯定支持该理论),但它们的加载地址仍然是首选地址。
一些第三方 DLL 似乎不受此影响,但总的来说,应用程序加载的 DLL 中约有 90% 会出现这种情况。
在 Windows 7 上,似乎唯一标记的 DLL 是实际移动的 DLL,并且加载时间(如预期的那样)明显更快。
这是什么原因造成的?我怎样才能阻止它?
编辑:因为它(理论上)听起来像 ASLR 的效果,所以我检查了一下,虽然 OS DLL 确实启用了 ASLR,但我们的却不是。甚至那些也被重新定位,因此不会占用任何其他 DLL 的地址。