モーグルとカバとパウダーの日記

モーグルやカバ(EXカービング)山スキー(BC)などがメインの日記でした。今は仕事のコンピュータ系のネタが主になっています。以前はスパム対策関連が多かったのですが最近はディープラーニング関連が多めです。

cygwinで32bit dllと64bit dllが混ざって動かなくなった件

先日からWindows8の64bit環境に移ったのですが、cygwinrubyだとかsshだとかが動かなくなるという状況にハマりました。

なぜそれが起きたのか顛末です。


cygwinは結構最近まで32bit環境用のsetup.exeだけが提供されていました。(確か)
ちなみにgnupackのcygwinも32bit環境になっています。

しかし最近になって32bit環境用のsetup-x86.exeと64bit環境用のsetup-x86_64.exeの2つが用意されるようになりました。


自分はWindowsの64bit環境使うまで、64bit環境だと64bit用のバイナリでないとインストール出来ないのだと思っていたのですが、実は多くのものが32bit用のものもそのままインストールして実行できます。

そしてWindows8 64bitには、以前にダウンロードしていたsetup.exeを使ってcygwinのインストールをしたため、意識せずに32bit用のcygwin環境を使っていたのでした。


cygwinは通常だと、インストールに使うsetup.exeを使ってパッケージ管理も行いますが、それだと面倒なのでapt-cygというaptライクにパッケージ管理ができるツールを使ってツールの追加インストールなど行っています。


apt-cyg - A command-line software installer for Cygwin - Google Project Hosting
http://code.google.com/p/apt-cyg/


それが8月くらいから?apt-cygがうまく動かなくなりました。

これはcygwinの64bit環境への対応がされたため、apt-cyg内で使われているURLが現在のURLと合わなくなったためでした。


cygwinで「`setup.ini' というファイルはありません。 Error updating setup.ini, reverting」の対処法 - Qiita [キータ]
http://qiita.com/DQNEO/items/f49d5a534eee6c3352a8

旧: ftp://ftp.jaist.ac.jp/pub/cygwin/
新: ftp://ftp.jaist.ac.jp/pub/cygwin/x86_64/


ここでパッチが当てられた変更内容は64bit環境用のものなのですが、自分はOSが64bit環境なのでこの修正内容のままで良いと思って、そのまま当てたのでした。
そしてこの修正でapt-cyg自体はうまく動くようになりました。


…が、そうやってインストールしたrubyや、なぜかsshなども動かなくなってしまいました。
その時、lsなど動くコマンドもあるのですが、動かないものはなんのエラーも出さずにそのままプロンプトに戻ってくる、という状況でした。


そこでコマンドプロンプトからそれら動かないコマンドを実行してみると「アプリケーションを正しく起動できませんでした (0xc000007b)」というエラーが発生して起動しないということがわかりました。

ぐぐってみると、これはexeから呼び出されるDLLが、32bitと64bitとで混在してしまった場合に起こるものだそうで、「DLL HELL」と呼ばれているのだそうです。


アプリケーションを正しく起動できませんでした (0xc000007b) - チラシの裏
http://www.globefish.jp/mt/2012/11/windows7-x64-curl.html


ちなみに現在入っているdllやexeが32bitか64bitかは、cygwinからfileコマンドを利用するとわかるようになっています。「PE32+ executable (DLL) (console) x86-64, for MS Windows」と出ている場合は64bit用です。


Twitter / kfujieda: @stealthinu cygwinならfileコマンドでわかりますよ。
https://twitter.com/kfujieda/status/372698920956461056


32bitと64bitのdllが混在してしまったのは、前述のapt-cygにパッチ当てた部分が理由だったので「/cygwin/x86_64/」を「/cygwin/x86/」に修正しました。

そして、誤って入ってしまった64bitのdllを一旦apt-cyg removeで削除して、再度apt-cyg installしたのですが、うまく治ってくれず、結局gnupackをサラで開けて構築しなおしました。


というわけで、apt-cyg使っていてうまく動かなくなった場合、自分が使っているcygwinが32bitなのか64bitなのかをfileコマンドとか使って確認し、それに合わせてapt-cygの修正を行って使うようにしましょう、ということでした。


(追記)

Cygwinがいつの間にか64bit版がリリースされていた件 - DQNEO起業日記
http://dqn.sakusakutto.jp/2013/12/cygwin64bit.html

上記apt-cygのパッチ書かれていたDQNEOさんも同じ問題にハマって修正されたそうです。