Dll base address

本文关键字:address base Dll | 更新日期: 2023-09-27 18:08:18

我有一个小的测试解决方案,一个exe和三个dll, exe调用三个dll每个一次。我分别为Dll1.dll, Dll2.dll和Dll3.dll设置了Build->Advanced->DLL Base Address设置为0x41000000, 0x42000000和0x43000000。我已经运行

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保持一致。

我的实际问题是:这是成功的标志吗?我有点困惑,因为我认为dll将恰好位于0x41000000, 0x42000000和0x43000000。结果显示,他们在那个区域徘徊,但从来没有真正坐在我让他们坐的地方。我的理解是,您希望dll准确地加载到您要求它们的地址,以便它们不必经历昂贵的重基操作(当您的dll已经生成时,这是非常非常昂贵的)。但是,这不正是正在发生的事情吗?当然,我的dll在某个区域徘徊,但它们并没有位于我要求它们位于的位置,因此,每次运行时都要执行昂贵的重新定位操作。这正是我想避免的。

注意:我对支持/反对rebase和ngen的争论不感兴趣。我只是想知道发生了什么,以及如何让它工作。

干杯!

Dll base address

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

NGEN工具是否限制为程序集生成二进制映像指定基址?一般来说,您必须将"首选基址"编译到程序集本身中。http://msdn.microsoft.com/en-us/magazine/cc163610.aspx

编辑*

但是,如果加载器不能将模块放置在所需的地址(因为它已经与另一个模块或数据块重叠了加载或分配),模块是重基的,这意味着它被加载到其他地址。的所有地址可执行映像需要修复

也看看互联网,似乎许多开发人员希望这个功能,但问题是保留与其他开发人员汇编不冲突的基地地址。还有哪些dll位于您期望的地址上?