在 MSVC 中,Base Address Randomizaiton 是默认选项。(从 VS2005 开始?)
因此,我不再手动重新设置 dll 的基地址。
但是当我使用 VS2003 时,我重新设置了所有 dll 以提高加载性能。
如果我使用 ASLR 选项,加载性能总是下降?
(当然我可以得到其他好处)
在 MSVC 中,Base Address Randomizaiton 是默认选项。(从 VS2005 开始?)
因此,我不再手动重新设置 dll 的基地址。
但是当我使用 VS2003 时,我重新设置了所有 dll 以提高加载性能。
如果我使用 ASLR 选项,加载性能总是下降?
(当然我可以得到其他好处)
最简洁的答案是不。
在没有 ASLR 的系统(例如 XP)上,在非首选地址加载 DLL 有几个成本:
项目 2 和 3 是迄今为止最大的成本,并且是过去需要手动重新设置 DLL 的主要原因。
使用 ASLR,修复程序由操作系统透明地应用,使得 DLL 看起来像是实际加载到其首选地址。没有写时复制错误,也没有创建进程私有页面。此外,修复仅应用于应用程序实际访问的页面,而不是整个图像,这意味着不会从磁盘读取额外数据。
除此之外,手动变基方案不能防止所有基地址冲突(例如,来自不同供应商的 DLL 可能会相互冲突,或者 OS DLL 可能会由于修补程序而增加大小并溢出到保留的范围内其他一些 DLL 等)。ASLR 在处理这些问题方面效率更高,因此从整体来看,它实际上可以提高性能。