いけむランド

はてダからやってきました

続・unable to remap が rebase で解決しなかった時の話

前回の対応からしばらく起きていなかったが、ちょっと前から再発するようになってきたので、いろいろ追加調査してみた結果をまとめる。


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 でも先月あたりにここらへんの話で盛り上がってました。