前回の対応からしばらく起きていなかったが、ちょっと前から再発するようになってきたので、いろいろ追加調査してみた結果をまとめる。
rebaseall は setup.exe からインストールしたすべての DLL に一意な base を割り当てるため、大量の DLL を置いている場合は一部の DLL の base が負になってしまうことがある。
こうなると再度 rebaseall をしようとしても、rebase.exe が使用する cygiconv-2.dll や cyggcc_s-1.dll が unable to remap を吐いて、rebase 自体が起動できなくなってしまう。こうなってしまった場合はこれらの DLL を setup.exe から再ダウンロード→インストールすれば良い。
また、DLL は一旦ロードされると Windows の再起動までその base を使い続けるらしいため、rebase した結果は再起動しないと反映されない。
以上より、unable to remap の問題を解決するには以下のとおりにやれば良い。
while (何かしらの unable to map で cygwin shell が起動できない) { if (rebase が実行できない) { unable to remap になる cygiconv-2.dll or cyggcc_s-1.dll を再インストールする。 } unable to remap が起きなくなるように -b を調整して、rebase を実行する。 Windows を再起動する。 }
本家 ML でも先月あたりにここらへんの話で盛り上がってました。