Jon*_*son 31 windows-7 cygwin bash
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
Run Code Online (Sandbox Code Playgroud)
这是什么意思,我应该怎么做才能修复它?
Ian*_* C. 41
您需要rebaseall
从rebase
包中运行命令来解决问题。
rebase
使用 Cygwinsetup.exe
实用程序安装包cygwin1.dll
rebaseall
在提示符下通常仅当安装了修改动态加载的库的已安装包时才需要重新定位。我承认一个坏习惯,rebaseall
即在 Cygwin 安装中安装或升级软件包后总是运行,而不是等待您遇到的错误出现。
至于你为什么会遇到这个错误以及 rebase 如何解决这个问题,这篇文章是这样说的:
你把它倒过来了。分叉不会破坏重定位。搬迁打破分叉。cygwin1.dll 需要有一个非常特殊的内存布局来实现 Win32 中的 fork 语义。如果此内存布局被打乱,fork 就会中断。重新定位 cygwin1.dll 会破坏所需的内存布局。'rebaseall' 尽最大努力将它知道的所有 Cygwin DLL 定位到避免冲突的布局中。这保持了所需的内存布局,因此 fork 可以完成它的工作。
ak2*_*ak2 11
这意味着 3rd 方程序(例如病毒扫描程序)或 Vista 中引入的 DLL 地址随机化功能以无法成功分叉的方式干扰了您的进程。
该rebaseall
实用程序可用于锁定 DLL,从而避免该问题。它是默认安装的。请参阅rebaseall --help
如何使用它,以及/usr/share/doc/Cygwin/rebase-3.0.1.README
更多详细信息。如果它没有帮助,peflagsall
是另一个值得尝试的。
编译“numpy”后我遇到了同样的问题。受影响的 dll 是 mtrand.dll。简单的
$ /bin/rebaseall
Run Code Online (Sandbox Code Playgroud)
不工作。
有帮助的是以下内容:检查受影响的 dll(在本例中为 time.dll)是否真的“重新定位”:
$ /bin/rebaseall -v
Run Code Online (Sandbox Code Playgroud)
如果没有创建一个包含受影响 dll 完整路径的列表。例如:
$ find /lib -name 'time.dll' > /tmp/mydll.txt
Run Code Online (Sandbox Code Playgroud)
该文件还可能包含更多 dll,每行一个。然后,调用
$ /bin/rebaseall -v -T /tmp/mydll.txt
Run Code Online (Sandbox Code Playgroud)
如上所述,没有其他 cygwin 东西在运行。time.dll 现在应该重新定位(除了“正常”重新定位之外)。
(奇怪:在 10 年中将 cygwin 与 nt、windows2000、xp 一起使用,我只需要“rebase”一次。在(64 位)window-7 的某一天,这已经是必要的了。)