読者です 読者をやめる 読者になる 読者になる

自ビルドしたパッケージの 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 追記:
ちゃんとした方法を既に書いてる方がおられました^^;

*1:標準入力からバイナリデータを読み取る可能性のあるプログラムは本来 setmode() や freopen() により stdin をバイナリモードに再設定すべきで、そうなっていればこの仕様でも問題はないのだが、自分で書くものも含め全てのプログラムでそれが徹底されることは期待しがたいし、言語によっては面倒なこともある