问题 Cygwin中的rebaseall有什么作用?


当在cygwin中遇到dll /分叉错误时,我正在调用 rebaseall 脚本和一切神奇地再次起作用。我知道它以某种方式修改了cygwin安装中的dll,因为我在有问题的那些和重新安装的那些之间运行了差异。

它在这些二进制文件中完全修改了什么并使它们再次工作?


12647
2017-10-14 12:51


起源

相关: - stackoverflow.com/q/37602608/1454514 - DRS David Soft


答案:


根据 有关模块基址的错误消息

Windows上的DLL需要在非冲突的基址上加载到内存中。 rebaseall是一个cygwin实用程序,它扫描当前安装的所有库,并将每个库设置为请求不同的基址,以便不会发生任何冲突。

从中获得更多技术解释 处理rebaseall的重复失败以允许cygwin重映射

由于unix fork语义(可能),cygwin库必须映射到fork的父级和子级中的相同位置。所有cygwin库都有关于它们应该在进程地址空间中映射的位置的提示;如果遵循这些提示,则每个库将映射到两个地址空间中的相同位置。但是,Windows非常乐意将DLL映射到地址空间的任何位置;提示不被视为控制。当cygwin进程启动并且其中一个库无法映射到其提示指定的位置时,会发生重新映射错误。

/ usr / bin / rebaseall更改所有cygwin库的DLL提示,以便不存在库间冲突;它通过从基地址开始选择一个连续但不重叠的库布局来完成此操作。此过程确保没有intra-cygwin冲突,但不能处理与cygwin进程地址空间中的外部DLL(例如反病毒DLL)的冲突。


15
2017-10-15 02:06



正是我想要学习的东西! - Fr0stBit