Cygwinで "unable to remap *.dll" が出るときは rebaseall らしい
が、実行するとこんなメッセージが出る。
rebaseall: only ash processes are allowed during rebasing Exit all Cygwin processes and stop all Cygwin services. Execute ash from Start/Run... or a cmd or command window. Execute '/bin/rebaseall' from ash.
/usr/bin/rebaseall のスクリプトを見ると、こんなことが書かれてる。
# Verify only ash processes are running grep -E -q -i -v '/ash(.exe)?$' /proc/[0-9]*/exename if [ $? -eq 0 -a -z "$RebaseDebug" ] then echo "$ProgramName: only ash processes are allowed during rebasing" echo " Exit all Cygwin processes and stop all Cygwin services." echo " Execute ash from Start/Run... or a cmd or command window." echo " Execute '/bin/rebaseall' from ash." exit 2 fi
ので、
$ RebaseDebug=1 rebaseall -v /usr/bin/cygcrypt-0.dll: new base = 6ffe0000, new size = 20000 /usr/bin/cygicons-0.dll: new base = 6ff80000, new size = 60000 /usr/bin/cygbz2-1.dll: new base = 6ff50000, new size = 30000 /usr/bin/cygdb-4.5.dll: new base = 6fe50000, new size = 100000 /usr/bin/cygdb_cxx-4.5.dll: new base = 6fcf0000, new size = 160000 /usr/bin/cygexpat-1.dll: new base = 6fcb0000, new size = 40000 /usr/bin/cyggcc_s-1.dll: new base = 6fc90000, new size = 20000 /usr/bin/cyggdbm-4.dll: new base = 6fc70000, new size = 20000 /usr/bin/cyggdbm_compat-4.dll: new base = 6fc50000, new size = 20000 ReBaseImage (/usr/bin/cygiconv-2.dll) failed with last error = 6
やったーできたー。って、最後失敗してるじゃん。
Process Explorerなどで、Cygwinっぽいdll(パスにcygwinっぽい文字列が入ってるものw)をロードしてるプロセスを見つけて片っ端から殺していく。
で、コマンドプロンプトから再度実行するとエラーも出ずにうまくいった!
(鬱陶しいので上のコードはコメントアウトしておく)
cygwin\usr\bin>ash rebaseall -v
って
前にも書いてたな、これ。
CygwinでWin32::GuiTestを使っているときに外部コマンドを実行するとエラーになるっぽい - XXXannex
当時の問題も、この手順で解決できそうだなあ・・・。
追記 2013/09/25
いつからか知らないけど、rebaseallに-pオプションがついてる。
107 p) 108 check_for_dash_only="no";;
ので、bashとかから使う場合は "rebaseall -pv" で問題なさそう。