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" で問題なさそう。