我的 Cygwin 环境 (Windows 7 O/S) 出现了一个奇怪的问题。几天前我还可以正常运行 perl 脚本,但今天我得到了
0 [main] perl 5056 C:\cygwin\bin\perl.exe: *** fatal error - unable to remap \\?\C:\cygwin\lib\perl
5\5.10\i686-cygwin\auto\Socket\Socket.dll to same address as parent: 0x8F0000 != 0x960000
Stack trace:
Frame Function Args
0088B508 6102749B (0088B508, 00000000, 00000000, 00000000)
0088B7F8 6102749B (61177B80, 00008000, 00000000, 61179977)
0088C828 61004AFB (611A136C, 6123E0FC, 008F0000, 00960000)
End of stack trace
我尝试按照建议运行 rebase here但问题仍然存在。任何答案表示赞赏,因为我明天有一个演示需要这个脚本。没想到会出现这样的问题!
最佳答案
这是一个半知情的答案,因为我遇到过类似的困难并最终四处乱窜,直到问题消失。
不带参数的rebaseall
将 rebase 所有从 cygwin 包安装的 dll
文件。然而,您通常会从您构建和安装的其他程序中获得许多其他 dll,包括使用 XS 代码安装的 Perl 模块,并且您需要以某种方式将这些模块告诉 rebaseall
。
可能有更简单的方法来做到这一点,我希望我没有忘记任何步骤,但我认为我在做这样的事情时取得了一些成功:
- 获取系统中在 cygwin 下运行的所有 dll 的列表。可能像
find/bin/lib/usr/home -name\*.dll >/tmp/file1
- 退出所有 cygwin 进程,在 Windows 命令提示符下以
ash
或dash
shell 打开,然后运行 /bin/rebaseall -v >/tmp/file2
。-v
开关在rebase
中设置了一个 Verbose 标志,该标志列出了使用默认设置重新设置基准的所有文件。 - 使用
/tmp/file1
和/tmp/file2
创建一个新文件,比如/tmp/file3
包含完整的列表您将要 rebase 的文件。据我所知,首先列出系统 dll(/tmp/file2
中的所有文件)很重要, - 现在运行
rebaseall -v -T/tmp/file3
(在 ash 中,在关闭所有 cygwin 进程等之后)。注意输出。如果有关于 rebase 某些特定 dll 的错误消息,请从/tmp/file3
中删除该条目,然后重试。
这可能无法解决您的问题,但也许可以帮助您解决大部分问题。如果您最终弄明白了,我希望您能回来填补这个解决方案中的一些漏洞。
关于cygwin下perl.exe重映射错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6901274/