DLL基地址

时间:2011-09-13 00:07:56

标签: c# .net dll ngen rebasing

我有一个小的测试解决方案,有一个exe和三个Dll,exe每次调用三个Dll。 我已将 Build-> Advanced-> DLL基地址设置分别设置为0x41000000,0x42000000和0x43000000,分别用于Dll1.dll,Dll2.dll和Dll3.dll。我跑了

ngen install ConsoleApplication1.exe

这已经成功地将应用程序与三个Dll一起使用了。我真的不想确定exe,但到目前为止,这是产生任何结果的唯一方法。

在运行时,我使用VMMap监视虚拟地址空间,它显示ngen'd Dll位于一致的虚拟内存范围内,但是它们仍然在该范围内跳跃,每个地址加载一个稍微不同的地址我运行它们的时间。 VMMap显示在我尝试加载图像的地址上没有分配任何内容,因此这种跳跃行为不是由地址冲突引起的。

我一直在记录日志:

   Dll1       Dll2       Dll3
0x40140000 0x411D0000 0x42810000 
0x40580000 0x41EB0000 0x426B0000 
0x40190000 0x41FB0000 0x42380000 
0x40F30000 0x41FD0000 0x42050000 
0x409B0000 0x41BF0000 0x42910000 
0x408E0000 0x41860000 0x42050000 
0x40B50000 0x41280000 0x42A80000

请注意,对于所有运行中的所有三个Dll,地址的前两位保持一致。

我的实际问题:这是否是成功的标志?我有点困惑,因为我认为Dlls将准确地坐在0x41000000,0x42000000和0x43000000。结果显示他们在那个区域附近,但实际上从未坐在我要求他们坐的地方。我的理解是你希望Dlls完全加载到你要求它们的地址,这样他们就不必经历昂贵的变基操作(当你的Dll被用来时,它非常昂贵非常非常昂贵ngen'd)。但是,这究竟是不是正在发生什么?当然,我的Dlls在某个区域闲逛,但是他们并没有准确地坐在我要求他们坐的地方,所以每次运行时都会进行昂贵的变速操作吗?这正是我想要避免的。

注意:我对/ rebasing和ngen的参数不感兴趣。我只是想知道发生了什么以及如何让它发挥作用。

干杯!

2 个答案:

答案 0 :(得分:3)

可以是ASLR(地址空间布局随机化) - 查看http://social.msdn.microsoft.com/Forums/en/vcgeneral/thread/bac7e300-f3df-4087-9c4b-847880d625ad

中的链接

答案 1 :(得分:0)

NGEN工具是否限制为程序集指定二进制映像的基址。 Afaik你必须将“首选基地址”编译到程序集本身。 http://msdn.microsoft.com/en-us/magazine/cc163610.aspx

编辑*

  

但是,如果加载程序无法将模块放在所需的地址   (因为它已经与另一个模块或数据重叠   加载或分配),模块被重新定义,意味着它被加载   其他一些地址。这意味着所有地址都在   可执行映像需要修复。

另外看互联网似乎许多开发人员希望这个功能,但问题是保留不与其他开发人员组件冲突的基地址。还有哪些其他DLL位于您希望您所在的地址?

相关问题