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

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

在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来修复该问题。

  1. rebase使用 Cygwinsetup.exe实用程序安装包
  2. 关闭所有正在运行的使用cygwin1.dll
  3. 打开 Cygwin shell
  4. 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。

相关内容