当在cygwin中遇到dll /分叉错误时,我正在调用rebaseall
脚本,一切都神奇地再次起作用。我知道它以某种方式修改了cygwin安装中的dll,因为我在有问题的和重新安装的那些之间运行了差异。
它在这些二进制文件中完全修改了什么并使它们再次起作用?
答案 0 :(得分:19)
根据Error messages about module base addresses:
Windows上的DLL需要在非冲突的基地址加载到内存中。 rebaseall是一个cygwin实用程序,它扫描当前安装的所有库,并将每个库设置为请求不同的基址,以便不会发生冲突。
来自Handling repeated failures of rebaseall to allow cygwin remaps的更多技术性解释:
由于unix fork语义(推测),cygwin库必须映射到fork的父级和子级中的相同位置。所有cygwin库都有关于它们应该在进程地址空间中映射的位置的提示;如果遵循这些提示,则每个库将映射到两个地址空间中的相同位置。但是,Windows非常乐意将DLL映射到地址空间的任何位置;提示不被视为控制。当cygwin进程启动并且其中一个库无法映射到其提示指定的位置时,会发生重新映射错误。
/ usr / bin / rebaseall更改所有cygwin库的DLL提示,以便不存在库间冲突;它通过选择一个连续但不重叠的库布局从基地址开始并向下工作来实现这一点。此过程确保没有intra-cygwin冲突,但无法处理与cygwin进程地址空间中的外部DLL(例如反病毒DLL)的冲突。