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 に付いてくればいいんですがねぇ。

Trackback

no comment untill now

Add your comment now