第13回 Universal Binary【後編】Undocumented Mac OS X(3/4 ページ)

» 2007年12月27日 04時23分 公開
[白山貴之,ITmedia]

2つ以上のアーキテクチャ

 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にあるアーキテクチャが指定可能だった。

表1 表1 「-arch」オプションで指定できるアーキテクチャ名一覧。cputype、subtypeについては/usr/include/mach/machine.h参照

Universal Binaryの確認

 実行ファイルが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

実行例5 fileコマンドを利用し、その実行ファイルにどのようなアーキテクチャが含まれているか調べられる

 GUIから確認するなら、Finderの「情報を見る」で表示される情報パネルの「一般情報」を見てみるとよい。1種類のCPUのアーキテクチャにしか対応していない場合はそのアーキテクチャ名を、複数に対応している場合は「(Universal)」と表示される(図4、5)

右:図5 Universal Binaryの場合、Finderの「情報を見る」の一般情報ではこのように「(Universal)」と表示される

 もっと詳しい情報が必要な場合は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)

実行例6 otoolは、Mach-O形式のオブジェクトファイルに関する各種情報を取得するコマンドだ。「-f」オプションを用いることで、FATヘッダとfat_arch構造体の内容をすべて知ることができる

 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

実行例7 「-h」オプションを用いるとMachヘッダの内容が出力される。Universal Binaryに対して「-h」で出力を行うと、通常は実行時に選択されるアーキテクチャのMachヘッダの内容が表示される。特定のアーキテクチャのMachヘッダを出力したい場合は、「-arch」オプションを併用する

このページで出てきた専門用語

特化した最適化を許された状態でビルド

許されたからといって、使われているとは限らないことに注意。実際のところ、「-arch ppc」と「-arch ppc750」の間で有意な性能差が出るとは考えがたい。

otoolコマンド

otoolは32ビットバイナリ専用で、64ビットのMachヘッダを確認する場合は、otool64を使用する。


関連キーワード

Mac | Mac OS X | SDK | x86 | Apple


Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ