Cygwin致命错误无法重映射。是什么意思?


30

python在cygwin中运行时,出现以下错误:

    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

这是什么意思,我应该怎么解决?

Answers:


40

您需要rebaseallrebase软件包中运行命令来解决此问题。

  1. rebase使用Cygwin setup.exe实用程序安装软件包
  2. 关闭所有使用 cygwin1.dll
  3. 打开Cygwin外壳
  4. 键入rebaseall在提示符下

通常仅在安装了已安装的程序包来修改动态加载的库时才需要重新设置基准。我会承认一个坏习惯,那就是rebaseall在Cygwin安装中安装或升级软件包后始终运行,而不是等待您遇到的错误来显示。

至于为什么会出现该错误以及重新部署是如何解决该问题的,这篇文章对此发表了看法:

你有倒退。分叉不会破坏重定位。搬迁打破了分叉。cygwin1.dll需要具有非常特殊的内存布局以在Win32中实现fork语义。如果此内存布局被破坏,则分叉会中断。重新定位cygwin1.dll会破坏所需的内存布局。'rebaseall'尽其所能将其知道的所有Cygwin DLL定位到避免冲突的布局中。这样可以保持所需的内存布局,以便fork可以完成其工作。


1
我正在尝试执行此操作,但没有成功...直到我重新启动Windows(在rebaseall和peflagsall之后)
Jon Erickson 2010年

伊恩·C:你是我的英雄!
Stefan Rusek

此外,rebaseall似乎需要管理员权限在Windows 7
xtofl

在某些情况下,分隔基本地址可能会有所帮助,如此处所示:cygwin.com/ml/cygwin/2011-04/msg00306.html
lapo 2011年

2
您需要以灰烬或破折号的方式进行此操作,而不是通过常规的Cygwin终端进行。使用开始->运行启动它,在cygwin \ usr \ bin \ ash中。运行ash后,键入/ usr / bin / rebaseall并按Enter。
Maciej Swic 2011年

10

这意味着Vista中引入的第三方程序(例如病毒扫描程序)或DLL地址随机化功能都以无法成功分叉的方式干扰了您的进程。

rebaseall实用程序可用于固定DLL,从而避免了该问题。默认情况下已安装。查看rebaseall --help如何使用它,以及/usr/share/doc/Cygwin/rebase-3.0.1.README更多详细信息。如果没有帮助,peflagsall则值得尝试另一种方法。


谢谢=)这两个答案都帮助了我...但是我只能接受一个= \
乔恩·埃里克森

5

编译“ 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之外)。

(奇怪:在将cygwin与nt,windows2000,xp一起使用10年后,我只需要“重新设置基准”一次。在一天(使用64位)window-7中,这已经是必需的。)


2

这个问题有答案。

来源: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实例。启动破折号或灰烬(位于Cygwin安装目录下的bin目录中),然后运行:

$ /bin/rebaseall -v

它应该没有错误地结束。如果相反,则上述结果将导致如下错误:

rebaseall:'/cygdrive/c/Users/ADMINI~1/AppData/Local/Temp' is not writable

打开Cygwin外壳程序并运行:

$ chmod 777 ~/AppData/Local/Temp

关闭您的外壳窗口,然后重复上述步骤。完成后,重新启动PC。使用rebaseall之前,请记住关闭所有打开的Cygwin外壳。


最好将链接中的信息复制给以后的用户,以防链接失败。
paradd0x 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.