自ビルドしたパッケージの rebase
私はCygwin上で自ビルドした zsh を使っているのですが、先日Cygwinをアップデートしたところrebase問題が発生してしまいました:
2 [main] zsh 3580 child_info_fork::abort: unable to remap zle.dll to same address as parent (00FA0000) - try running rebaseall compaudit:91: fork failed: resource temporarily unavailable 2 [main] zsh 2528 child_info_fork::abort: unable to remap complete.dll to same address as parent (00FE0000) - try running rebaseall compinit:529: fork failed: resource temporarily unavailable
この問題は過去にも何度か経験していて、ash から rebaseall を実行すれば直ると思ったのですが、rebaseall は自ビルドした(/usr/local/ 以下にインストールした)パッケージの面倒までは見てくれないようで効果がありませんでした。
どうも自力で rebase するしかないようなので、rebase のヘルプを見てみたところ
-s, --database Utilize the rebase database to find unused memory slots to rebase the files on the command line to. (Implies -d).
というオプションがあったため、ash から
$ /bin/rebase -s -v /usr/local/lib/zsh/4.3.12/zsh/*.dll
としてみたところ、自ビルドした zsh が正常に動くようになりました(これを実行するとCygwin全体のDLLのベースアドレスも変更されるようです。念のためその後 ash から rebaseall してみましたが、自ビルドした zsh を含め特に問題は起こっていないようです)。しかしこれが正しいやり方なのかどうかはよくわかりません^^;
ちなみにCygwinには公式の zsh パッケージもあるのですが、これは標準入力を強制的にテキストモードに設定する仕様になっており、色々面倒*1だと感じたので、私はこの機能を無効に(Src/main.c の cygwin_premain0() を丸々削除)して自ビルドしたものを使うようにしています。
2012/02/13 追記:
ちゃんとした方法を既に書いてる方がおられました^^;