Windows や Linux 上で動作する Mac OS X 用のアセンブラやリンカをどうやって作るのか
Windows の Cygwin 上で C のコードから Mac OS X 用のバイナリをクロスコンパイルしようとして苦戦中。
GNU binutils はクロス環境で別のターゲットの OS 用のバイナリを吐くようにビルドすることができるのだが、なぜか Mac OS X (Darwin) 用のバイナリを binutils では吐くことができない。
as (アセンブラ) が make されない (Makefile を直接起動すると、Mach-O フォーマットに対応していないというようなエラーが表示される) ためである。
どうやら binutils の as のコード自体が Darwin が使用している Mach-O フォーマットに対応していないというのが根本的な原因のようで、これは少し書き換えたくらいではどうすることもできないので、とりあえず binutils は諦めて、Apple 本家のサイトから cctools を落としてきて (この中に Apple 製の Mach-O に対応した as が入っている)、がんばって Cygwin 環境でビルドしようと試みる。
しかしどうも Apple の as は Darwin のシステムライブラリにかなり依存するようなコードがたくさん含まれているらしく、そのままでは簡単にコンパイルできない。というか、まず、そもそも Apple が改造した gcc を落としてきて、それを Cygwin 上で make して、その gcc を使って cctools を make しないといけない。うまくそこまでではたとしても、libSystem (Mac OS X 独自の変なライブラリ) がないと色々な関数が足らず Cygwin や Linux ではビルドできないようだ。それらの足りないシステムコール類を自前でエミュレーションして実装すればいけるが、数時間はかかってしまうだろう。
そのようなことで困っていたところ、cctools を Linux 等の他の OS で make できるようにした odcctools (http://odcctools.darwinports.com/) というものを発見。要するに↑で書いたような移植作業をしたやつだと思う。
これを使用すれば Linux 上での make はできるようだ。BSD でもできるらしい。Cygwin ではちょっと書き換えないとできないが一応途中までは成功した。
ただし odcctools のメンテナンスは 2006 年 11 月 17 日で止まってしまっているようで、PowerPC 32bit / 64bit と Intel 32bit のバイナリは吐けるのだが、Intel 64 (x64) のバイナリは吐けない。困ったな。実は Intel 64 (x64) のバイナリが吐きたいのだが。まあがんばって自分で移植するか。