迁移到 Windows 7 x64 后,我在此环境中运行 Cygwin 时遇到了问题。看来 Windows 7 的 ASLR 功能是导致此问题的原因。它会导致各种 DLL 加载到虚拟内存中的不同地址,并且看来当生成子进程时,Cygwin 期望父进程和子进程中的相同 DLL 具有相同的基址。显然,对此进行了特定检查,并显示以下消息:
5816 [main] perl 4148 C:\Cygwin\bin\perl.exe: *** fatal error - unable to remap C:\Cygwin\lib\perl5\5.10\i686-Cygwin\auto\Data\Dumper\Dumper.dll to same address as parent(0x9A0000) != 0xB40000
我尝试通过将 HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\MoveImages: DWORD 设置为 0 来关闭 ASLR,但似乎没有任何作用:DLL 仍然被加载到随机位置(通过上述消息和使用 Process Explorer 查看两个进程的地址空间来验证)
与此同时,我计划使用 XP 模式来运行 Cygwin,但它看起来有点不自然,而且有一些限制。
有人知道如何在 Windows 7 x64 下直接运行 Cygwin 吗?
答案1
在 Windows 7 64 位下遇到了同样的问题,重新定基解决它:
答案2
perlrebase(我是维护者和作者)
尚未验证:
- 如果仍然收到 fork 错误,请尝试清除 dll 中的 ASLR 标志。
在所有 dll 中(例如您的 rebase.lst)使用 peflags -d0
我现在正在尝试这个,如果它有帮助,我会发布一个新的 perl 版本。
答案3
这是你需要Windows XP 模式,而不是 XP 兼容性。希望您的处理器满足要求;您需要一个支持硬件虚拟化的处理器。
为确保无误,请运行下面适当的工具。
- 英特尔处理器识别实用程序
- AMD 虚拟化系统兼容性实用程序
注意 XP 模式仍处于候选发布模式。至少在我的 32 位机器上它表现良好。我相信您在 x64 上也会有类似的体验。
编辑:我只能在每个答案中发布一个超链接,直到我不再是新用户为止。因此链接会转到此帖子的评论中