Xcode は(というか Mac OS X が、か?)ツールセットが gcc / llvm なのでアセンブラとして gas が使えますが、もう 1 つ NASM も標準で入っていて、好きなほうを使うことができます。
ところがこの NASM、入っているバージョンが「古い」です。
[umezawa@metis:ttys000 ~]$ nasm -v NASM version 0.98.40 (Apple Computer, Inc. build 11) compiled on Oct 24 2010 [umezawa@metis:ttys000 ~]$
0.98.40 というバージョンは NASM 本家にはありません(0.x 系列は 0.98.39 が最終バージョン)。おそらく、Apple が修正してバージョンをつけたものなのでしょう。私が使っているのは Xcode 3.2.6 ですが、Xcode 4.1 でも同様でした(Xcode 4.2 でどうなってるかは未調査)。
Windows 上で NASM 2.9.10 (現時点での最新)を前提として書いたソースを Mac OS X に持ってきたら盛大にエラーが出てきたので、Mac OS X の方も NASM を 2.9.10 にしましょう。(ちなみにググるとちょっと前は Mac OS X 向けに Mach-O バイナリを吐くとおかしなコードになるというバグがあったような記述が見つかるのですが、NASM の更新履歴を見る限り今はそんなことはないように見えます)
で、NASM 本家から Mac OS X 用バイナリを持ってきて /usr/local/bin に展開したのですが…使われません(もちろんパスは /usr/bin より優先されるようにしてある)。それどころか /usr/bin にあるものを置き換えても使われていません。なんでかなーと思っていると、
[umezawa@metis:ttys000 ~]$ find / -name nasm 2>/dev/null /Developer/Documentation/DocSets/com.apple.adc.documentation.AppleSnowLeopard.CoreReference.docset/Contents/Resources/Documents/documentation/DeveloperTools/nasm /Developer/Documentation/DocSets/com.apple.ADC_Reference_Library.DeveloperTools.docset/Contents/Resources/Documents/documentation/DeveloperTools/nasm /Developer/usr/bin/nasm /Developer/usr/share/doc/nasm /Users/umezawa/Downloads/nasm-2.09.10/nasm /usr/bin/nasm /usr/local/bin/nasm /usr/share/doc/nasm [umezawa@metis:ttys000 ~]$
これか。
というわけで /Developer/usr/bin/nasm を置き換えて終了。副作用が気になるところではありますが、問題なく動いているように見えます。どうせ自分のプロジェクトであるコーデック開発にしか使わないし。(配布ソースから自分でビルドする他人の事はあまり考えていない)
[root@metis:ttys000 ~]# cd /Developer/usr/bin [root@metis:ttys000 ~]# mv nasm nasm-0.98.40 [root@metis:ttys000 ~]# cp -a /Users/umezawa/Downloads/nasm-2.09.10/nasm ./ [root@metis:ttys000 ~]#
もうちょっとマシな方法として、/usr/local/bin に新しい nasm を置いて、Xcode 側で新しい nasm を使うビルドルールを作る、というのが考えられるのですが、それをやる方法が分からなかった(というか疲れてて探す気が起きなかった)のでやっていません。誰か教えてください :-p
ていうか、古いバージョンを Apple が修正したものではなく、本家の新しいバージョン(を Apple が修正したものでもいい)が Xcode に付いてくればいいんですがねぇ。
no comment untill now