Mach-Oでは、CPUの種別はcputypeとsubtypeという2つの数値で区別される。cputypeはPowerPCなど相互に互換性のないレベルでの区別を示し、subtypeはPowerPCならG3(ppc750)やG4(ppc7400、ppc7450)など互換性があるが最適化が異なったり有効な命令セットが若干異なるCPUを区別したりする場合に利用される。
「-arch ppc」はPowerPC一般を意味するが、「-arch ppc750」と指定することでGCCはG3に特化した最適化を許された状態でビルド*を行う。例えば「-arch ppc750 -arch ppc7400 -arch ppc970」と指定すればG3、G4、G5(32ビット)に対応したコードが生成され、「-arch ppc -arch ppc64 -arch i386」とすれば32ビットモードのPowerPC、64ビットモードのPowerPC、x86のコードで構成されたUniversal Binaryが構築される。
また、確認した限りでは表1にあるアーキテクチャが指定可能だった。
実行ファイルがUniversal Binaryかそうでないかを確認する最も簡単な方法は、fileコマンドを実行し調べてみることだ。Mac OS Xのfileコマンドは、Mach-
OヘッダやFATヘッダを調査してどういったCPU向けのコードが含まれているのかをすべて表示する(実行例5)。
% file a.out
a.out: Mach-O fat file with 2 architectures
a.out (for architecture ppc): Mach-O executable ppc
a.out (for architecture i386): Mach-O executable i386
GUIから確認するなら、Finderの「情報を見る」で表示される情報パネルの「一般情報」を見てみるとよい。1種類のCPUのアーキテクチャにしか対応していない場合はそのアーキテクチャ名を、複数に対応している場合は「(Universal)」と表示される(図4、5)。
もっと詳しい情報が必要な場合はotoolコマンド*を使う。「-f」オプションを使うことで、fat-arch構造体の内容を表示する(実行例6)。
% otool -f ./mab.out
Fat headers
fat_magic 0xcafebabe
nfat_arch 2
architecture 0
cputype 18
cpusubtype 0
offset 4096
size 17748
align 2^12 (4096)
architecture 1
cputype 7
cpusubtype 3
offset 24576
size 14768
align 2^12 (4096)
Machヘッダの確認には「-h」オプションを使用する。Universal Binaryに対して「-h」を単独で使用すると、そのマシンで実際に実行するときに選択するであろうアーキテクチャのMachヘッダの内容を表示する。ほかのアーキテクチャのMachヘッダの内容を表示させたい場合は「-h」に加えて「-arch」でCPUの種別を指定するとよい(実行例7)。
% otool -h mab.out
mab.out:
Mach header
magic cputype cpusubtype filetype ncmds sizeofcmds flags
0xfeedface 18 0 2 10 1348 0x00000085
% otool -h -arch i386 mab.out
mab.out:
Mach header
magic cputype cpusubtype filetype ncmds sizeofcmds flags
0xfeedface 7 3 2 11 1376 0x00000085
許されたからといって、使われているとは限らないことに注意。実際のところ、「-arch ppc」と「-arch ppc750」の間で有意な性能差が出るとは考えがたい。
otoolは32ビットバイナリ専用で、64ビットのMachヘッダを確認する場合は、otool64を使用する。
Copyright © ITmedia, Inc. All Rights Reserved.