【发布时间】:2016-11-10 12:26:23
【问题描述】:
我正在开发一个带有几个 dll 的 64 位应用程序。
来自win 32,其中加载的dll的默认基地址 是 0x10.000.000,然后它们在发生冲突时被移动。
Wintellect 的 John Robbins 建议为 dll 设置唯一地址,这样不同运行时内存空间使用情况相同。
他在调试 .net 2.0 应用程序的书中建议,基地址应以 dll 名称的第一个字母为指导。
a-c 0x60.000.000
d-f 0x61.000.000
g-i 0x62.000.000
j-l 0x63.000.000
m-o 0x64.000.000
p-r 0x65.000.000
s-u 0x66.000.000
v-x 0x67.000.000
y-z 0x68.000.000
我认为 64 位已经改变了。 (至少是地址)。
有没有人找到更好的解决方案?
(所以在另一台电脑上运行的地址可以映射到我的吗?
- 或者我可以加载某个地方制作的小型转储。)
【问题讨论】:
-
ASLR 的引入使关于基地址的旧论点无效,因为 (1) ASLR 会随机更改您的基地址;你很少再被加载到你的标称基地址,并且 (2) 与 ASLR 一起出现了一种更有效的重定位算法,因此重定位 DLL 的成本非常低,TL;DR:一旦你有了这个指导就不再适用了ASLR。
标签: c# c++ dll 64-bit virtual-address-space