我认为如果我们使用ASLR在我们的构建期间重新定位我们的dll是没有意义的,因为当内核加载时dll会再次被重新设置?
我担心我们的应用程序经常用在终端服务机器上。因此,如果在加载时发生重新定位,我们最终可能会为每个加载的进程重新设置dll(每个会话将有一个进程)。这将导致更多的内存使用和分页,而不是我们想要支付的。我需要担心吗?
我发现以下博客文章中说,变基只发生一次,而且是系统范围的:Matt Evans - Enabling ASLR for memory savings?。我还没有看到任何其他有关此内容的参考资料,所以我想确定在构建期间是否使用ASLR并且不进行rebase我不会在终端服务盒上导致内存问题?
答案 0 :(得分:1)
所以根据我的阅读,你不应该有问题。 ASLR使得dll被加载到半随机存储器地址,并且不应该仅为每个进程开始重新定位。如果你想检查dll的内存使用,有一个名为MassiveRebase的免费工具,它允许你动态加载两个dll并查看有关其内存使用的信息。它旨在查看aslr可能对内存的更改。 可以在此处找到该工具及其更多信息:http://www.tmurgent.com/appv/index.php/en/resources/tools/137-massive-rebase
希望这会有所帮助。
答案 1 :(得分:-3)
重新定位仍然有帮助。当操作系统加载时,它会将固定的随机值应用于DLL库。
结果是加载DLL的位置对于单个引导来说是典型的,但在机器和引导之间是不同的。
这意味着可以在进程之间共享许多进程中的给定DLL,因为它的所有代码数据都使用相同的值共享。
当移动DLL因为它的地址空间被占用时,它必须修改修正,并且共享较少的DLL,从而增加了系统负载。
如果您的DLL未共享,则不会影响资源。
如果将DLL加载到正确的位置,修复DLL的成本会更低,不确定ASLR是否属实,但仍可以节省资源加载时间。