在cygwin中运行时python
,出现以下错误:
0 [main] python 6140 C:\cygwin\bin\python.exe: *** fatal error - unable to remap \\?\C:\cygwin\lib\python2.6\lib-dynload\time.dll to same address as parent: 0x2B0000 != 0x360000
Stack trace:
Frame Function Args
00288E68 6102749B (00288E68, 00000000, 00000000, 00000000)
00289158 6102749B (61177B80, 00008000, 00000000, 61179977)
0028A188 61004AFB (611A136C, 6124112C, 002B0000, 00360000)
End of stack trace
0 [main] python 9048 fork: child 6140 - died waiting for dll loading, errno 11
abort: Resource temporarily unavailable
这是什么意思?我应该怎么做才能解决它?
答案1
您需要运行包rebaseall
中的命令rebase
来修复该问题。
rebase
使用 Cygwinsetup.exe
实用程序安装包- 关闭所有正在运行的使用
cygwin1.dll
- 打开 Cygwin shell
rebaseall
在提示符下输入
通常只有在安装的软件包修改动态加载的库时才需要重新定基。我承认rebaseall
在 Cygwin 安装中,总是在安装或升级软件包后运行而不是等待遇到的错误出现,这是一个坏习惯。
至于为什么会出现这个错误,以及如何通过 rebasing 解决这个问题,这个帖子对此有这样的看法:
您搞反了。分叉不会破坏重定位。重定位会破坏分叉。cygwin1.dll 需要具有非常特殊的内存布局才能在 Win32 中实现 fork 语义。如果此内存布局被破坏,则 fork 会中断。重定位 cygwin1.dll 会破坏所需的内存布局。'rebaseall' 会尽力将其知道的所有 Cygwin DLL 定位到可避免冲突的布局中。这样可以保持所需的内存布局,以便 fork 可以完成其工作。
答案2
这意味着第三方程序(例如病毒扫描程序或 Vista 中引入的 DLL 地址随机化功能)干扰了您的进程,以致无法成功分叉。
该rebaseall
实用程序可用于锁定 DLL,从而避免出现问题。默认情况下会安装它。请参阅rebaseall --help
如何使用它以及/usr/share/doc/Cygwin/rebase-3.0.1.README
更多详细信息。如果它没有帮助,peflagsall
是否值得尝试另一个。
答案3
我在编译“numpy”后遇到了同样的问题。受影响的 dll 是 mtrand.dll。很简单
$ /bin/rebaseall
不工作。
有帮助的是以下内容:检查受影响的 dll(在本例中为 time.dll)是否实际上已“重新定基”:
$ /bin/rebaseall -v
如果没有,则创建包含受影响 dll 的完整路径的列表。例如:
$ find /lib -name 'time.dll' > /tmp/mydll.txt
该文件可能还包含更多 dll,每行一个。然后,调用
$ /bin/rebaseall -v -T /tmp/mydll.txt
如上所述,没有其他 cygwin 程序在运行。现在应该重新设置 time.dll 的基准(除了“正常”的 rebaseall 之外)。
(奇怪的是:在 nt、windows2000、xp 上使用 cygwin 的 10 年时间里,我只需要“rebase”一次。但在使用(64 位)window-7 的一天里,这已经是必要的了。)
答案4
问题有答案。
来源:https://github.com/joyent/node/wiki/Building-node.js-on-Cygwin-(Windows)
无法重新映射到与父级相同的地址
fatal error – unable to remap \?\C:\cygwin\lib\python2.6\lib-dynload\time.dll to same address as parent: 0×360000 != 0×3E0000
对于 node.js 来说这也不是问题。首先使用 setup.exe 安装 base → rebase,然后关闭所有 Cygwin 实例。启动 dash 或 ash(位于 Cygwin 安装下的 bin 目录中)并运行:
$ /bin/rebaseall -v
它应该会顺利完成。但如果上述操作导致如下错误:
rebaseall:'/cygdrive/c/Users/ADMINI~1/AppData/Local/Temp' is not writable
打开 Cygwin shell 并运行:
$ chmod 777 ~/AppData/Local/Temp
关闭 shell 窗口并重复上述步骤。完成后,重新启动 PC。请记住在使用 rebaseall 之前关闭所有打开的 Cygwin shell。