Cygwin - fork エラー (rebase 問題)!
Updated:
先日、若干バージョンが古かった当方の Cygwin 環境をアップデートしました。 しかし、Cygwin 上で Ruby on Rails アプリを動かそうとすると以下のようなエラーが発生してしまうようになってしまいました。
0 [main] ruby 4392 child_info_fork::abort:
unable to remap etc.so to same address as parent (00EE0000)
- try running rebaseall
0 [main] ruby 2784 child_info_fork::abort:
unable to remap mysql2.so to same address as parent (00F00000)
- try running rebaseall
※実際は2行で出力。
出力メッセージによると、「rebaseall を試してみなさい」とのことです。 いわゆる(?)「Cygwin の rebase 問題」という現象です。 Cygwin をアップデートした際に、自分でビルドしたバイナリとアドレスが衝突した場合に発生するようです。
Cygwin ユーザならよく遭遇する現象です。 このような場合の対処方法についてのメモを残しておきます。
対処方法Permalink
以下の 1、2 の方法は失敗しています。 3 からの方法が成功する方法です。
1. (※失敗する方法) 単純に rebaseall を実行Permalink
Cygwin のターミナルで以下を実行する。
$ rebaseall -v
rebaseall: only ash or dash processes are allowed during rebasing
Exit all Cygwin processes and stop all Cygwin services.
Execute ash (or dash) from Start/Run... or a cmd or command window.
Execute '/bin/rebaseall' from ash (or dash).
一旦 Cygwin を止めて、ash シェル上で rebaseall を実行しなさい、というこのようです。
2. (※失敗する方法) ash シェル上で rebaseall を実行Permalink
Cygwin インストールフォルダの “/bin/ash.exe” を起動して、以下のコマンド実行してみる。
$ /bin/rebaseall -v
ズラズラと出力されます。 試しに、Rails アプリを動かしてみたが、まだ同じエラーが出力される。 どうやら、自ビルドしたものには rebaseall が効かないようです。
3. rebaseall を実行するリストを作成Permalink
rebaseall したいファイルを指定して rebaseall する方法を試してみます。 以下のようにしてリストを作成します。 今回は自ビルドした Ruby, MySQL 関連の “ruby.so”, “mysql2.so” が引っかかっているので、”/usr/local” ディレクトリ配下の “*.so” ファイル全てを指定しています。
$ find /usr/local -name '*.so' > /tmp/rebase_so.lst
4. ash シェルを起動Permalink
Cygwin ターミナルを終了して、ash シェル(Cygwin インストールフォルダの “/bin/ash.exe”)を起動します。
5. rebaseall を実行Permalink
ash シェル上で、先ほど作成したリストを指定して rebaseall を実行します。
$ /bin/rebaseall -T /tmp/rebase_so.lst -v
リストの内容分ズラズラと出力されます。 ※ cmd.exe を起動して “run ash rebase ~” とする方法もあるようです。
6. 確認Permalink
Cygwin を起動して、Rails アプリを起動して確認してみます。 当方の場合、うまく起動できました。
この対処方法を知っていれば、Cygwin をアップデートしてエラーが発生しても慌てなくてすみます。 またソースから configure, make, make install する、などという無駄な手間が省けます。
以上。
Comments