Leopard(10.5)でTiger(10.4)向けユニバーサルバイナリをコンパイル

Leopard(MacOS X 10.5)のgccを使ってコンパイルしたバイナリは、そのままではTiger(MacOS X 10.4)上では動かないようです。
ちょっと検索したところ、10.4uのSDKを指定すれば良いことが分かりました。
ついでに、ユニバーサルバイナリを作る方法も調べてみたところ、次のようにすれば良いようです。

SDKを指定

まず、XCodeを入れるときに「カスタマイズ」で「10.4u SDK」をインストールしておく必要があります。(デフォルトでON?)
その上で、-isysrootオプションに10.4u SDKを指定します。

% gcc test.c -isysroot /Developer/SDKs/MacOSX10.4u.sdk
ld: library not found for -lcrt1.10.5.o
collect2: ld returned 1 exit status

あれ?

このページによると、どうやら、-mmacosx-version-min=10.4 も指定しないとだめなようです。

% gcc test.c -isysroot /Developer/SDKs/MacOSX10.4u.sdk -mmacosx-version-min=10.4
% ./a.out
Hello,World!

今度はOK。

ユニバーサルにする

上記の指定に加え、-arch を複数指定します。

gcc test.c -arch i386 -arch ppc
または
gcc test.c -arch i386 -arch ppc -arch x86_64 -arch ppc64

後の方は、64bitにも対応させたい場合の指定。

% file a.out
a.out: Mach-O universal binary with 4 architectures
a.out (for architecture i386):	Mach-O executable i386
a.out (for architecture ppc):	Mach-O executable ppc
a.out (for architecture x86_64):	Mach-O 64-bit executable x86_64
a.out (for architecture ppc64):	Mach-O 64-bit executable ppc64

そもそもコードが対応してない(ポインタをintにキャストしてるとか…)場合はNGですが。
当然指定を増やせば増やすほどバイナリのサイズも増えるので、そこら辺は要検討です。