さよなら cygwin.dll、こんにちは DLL (いくらか嘘)

リファラで伝わりました。あーちなみに以下泡盛200ml程度含有状態で書いた文章で、日本人は酒を言い訳にすれば何をしてもいいらしい。

http://edward.dip.jp/20040820.html#p03

一段落については、それが今一つわからんから Win32 は私を幸福にしません。 Unix なら binutils にほぼ全てがあります。

そして二段落目については、三段落目に書かれているように、この話は「可能である」という情報さえ出しときゃそう苦労することなくできるかなあ、ということなので、とりあえずそれだけ書いといておいたという側面があります。

ですがせっかくなのでなんか書きます。ですがごくごく簡単な話です。そして依然として雑な記述です。 Windows を動かすことすらしていません。

cygwin.dll の方は -mno-cygwin です。それだけではもちろんリンクエラーが出るんですけど、ええとどんなエラーが出るかは覚えてません。

ですが解決法の調べ方はわかります。まず cygwinmingwgcc を入れます(これは無くてもいいかもしれず)。で、素の(gdc と一緒に入った奴じゃダメだよ!) gcc で -mno-cygwin -v オプション付きで hello worldコンパイルします。するとぐちゃぐちゃ出るのですが、 ld ... という行がリンクをしている部分だとわかると思います。よーするに static link している C のランタイムライブラリが cygwin.dll に依存してやがるのですが、今 ld の後に出てきたライブラリ群は(多分 crt1.o とかそういう名前に違い無いですよ) は cygwin.dll に依存してないので、 ld ... の部分を適当にコピーして、自分の gdcコンパイルしたオブジェクトをリンクするように修正すれば OK、のはず。しあげに、 objdump -p hoge.exe | grep dll などとして cygwin.dll が出てこなけりゃ OK 。

よーするにリンクするまでは cygwin.dll とは関係無いんです。 gcc だろうが gdc だろうが gcj だろうが gnat だろうが好きなもんでコンパイルすりゃいいんです。それがいつのバージョンだろうと知ったことじゃないです(まあ C++ みたいに mangling rule が変わると困るけど、んな言語 C++ 位?かな)。で、生成されたオブジェクトをリンクする時に cygwin.dll との訣別の意を表明しにゃならんのです。その時 gdc は現状 mingwgcc と一緒にはコンパイルできないんですけど、 cygwin に入ってる mingw のランタイム使えばいいってだけの話です。

とにかく我らが gcc はいろいろやってます。でも自分ではプリプロセスもコンパイルアセンブルもリンクもしてないんです。 C だったらプリプロセスとコンパイルは(まあプリプロセスはオプション次第だけど) cc1 が、アセンブルは as が、リンクは ld がやってるんです。具体的にどういうオプションで呼ばれているかは gcc -v すればわかります。個々の役割を理解すれば何ができて何ができないか、おのずと見えてくるはず。

DLL については、 DLL が作れない、なんてことは当然なくて、普通の手段で obj 群から dll は作れます。 Win32 は私を幸福にしないのでその dll 作成方法がめんどくさいんですけどまあぐぐれば出てきます。 COFF と OMF と ELF の夢の共演がそれはそれは素晴しくわかりにくくしてるようなのですけど、それは D とは別問題。あと implib とかも D とは別問題。

で、 extern(C) した関数をその通常の手段で公開すりゃ終わり、もしくは D linkage であってもなんらかの手段で mangling をどうにかしたら終わりだよってだけです。もちろん現状の dmdphobos だけではクラスロードはできません、でもそれなりのライブラリ書けばできます。何を当たり前のこと言ってるんだこのバカって言われそうですけど、勘違いしてた人もいたみたいなので。

ここから翌日の記述(これに限らず私は書いた日とそれを登録する日が結構ずれます)。まあ雑な記述ですけど fragment も役に立つことがあるとおっしゃっていることですし、いじるのもめんどうなのでこのままで。

なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h