UNIX, X-Windowアプリが
PowerPCバイナリのままでも、取り合えず動いていたのだが
PowerMac G4/MDD で作ってあった UNIX, X-Window関係のアプリ類(PowerPCバイナリ)だが、Mac Pro にそのまま持って行っても何とか動いていた。これは Rozettaエミュレータによる互換性が高いと言う事ではあるが、1つのアプリ(プロセス)内で PowerPC、Intelバイナリを混在させることはできない。その1つの例がスクリーンセーバーで、アプリ自体は Intelバイナリなので PowerPCバイナリのスクリーンセーバーモジュールを読み込んで動作させる事はできない。
これは UNIX, X-Windowアプリについて言うと、アプリ自体と実行時に読み込まれるダイナミックリンクライブラリで PowerPC、Intel バイナリ混在状態にはできないと言うことになる。PowerPCバイナリの UNIX, X-WIndowアプリは、どんな末端のライブラリであっても全て PowerPCバイナリでなければならない。では、MacOS Xシステム標準のライブラリはどうなっているのだろう。PowerPCバイナリのアプリだってシステムライブラリを使うし、当然 Intelバイナリのアプリも。
調べてみたら、
$ file /usr/lib/libc.dylib
/usr/lib/libc.dylib: Mach-O universal binary with 4 architectures
/usr/lib/libc.dylib (for architecture ppc7400): Mach-O dynamically linked shared library ppc
/usr/lib/libc.dylib (for architecture ppc64): Mach-O 64-bit dynamically linked shared library ppc64
/usr/lib/libc.dylib (for architecture i386): Mach-O dynamically linked shared library i386
/usr/lib/libc.dylib (for architecture x86_64): Mach-O 64-bit dynamically linked shared library x86_64
|
こうなっていた。Universalバイナリというファイル型式はアプリ(実行可能ファイル)だけのものではなくダイナミックリンクライブラリでも可能で、システムライブラリは PowerPC 32bit/64bit, Intel 32bit/64bit の実に4種類のバイナリをまとめた物になっていた。
これで動いているのだから、そのままにしておけば良いだろうとも思うが、そうも言ってられない。少し動作がおかしい所もあるし、バグ修正、特にセキュリティ修正が出たらそれを適用しておきたい。ところが、今Mac Pro上で普通にビルドすると、出来上がるのは Intel 32bitバイナリになる(↓)。
$ file /usr/local/lib/libtiff.3.dylib
/usr/local/lib/libtiff.3.dylib: Mach-O dynamically linked shared library i386
|
1つのダイナミックリンクライブラリを PowerPCバイナリから Intelバイナリに置き換えたら、関連するライブラリや、それを使っているアプリ全部を Intelバイナリ化しなければならない。でなければバイナリ混在状態になってしまい、動作しなくなってしまうのだ。
と言うわけで、ここのところ少しずつ UNIX, X-Window関連のアプリ、ライブラリの Intelバイナリ化を進めていたのだが・・・作り直したところ mltermが動かなくなってしまった。と言うか、最初はビルドすら通らなかった。原因は MacOS-X が Leopard になった事、X-Window が XFree86 から X.org になった事などだと思う。昨夜も色々ジタバタして、何とか mlterm のビルドを通し、実行時エラーの原因もいくつか特定、修正したのだが、まだ X-Windowのエラーが出て異常終了してしまう。先は長そうだ。
取り合えず mlterm-2.9.2 で修正した所をメモしておこう。
mlterm-2.9.2/kiklib/src/Makefile
CFLAGS = $(CFLAGS_LOCAL) -g -O2 -D_DARWIN_C_SOURCE
DEPOBJ = kik_pty_streams.o kik_utmp_bsd.o kik_dlfcn_dyld.o
mlterm-2.9.2/tool/mlconfig/mc_io.c (71行目)
if( read( fileno(stdin) , &c , 1) == 1)
mlterm-2.9.2/inputmethod/uim/Makefile
CFLAGS = $(CFLAGS_LOCAL) ¥
-D_DARWIN_C_SOURCE ¥
-DUSE_KBD -DUSE_UIM -DUSE_IM_PLUGIN -DUIM_0_4_4_OR_LATER ¥
|
赤字の部分が追加したり修正したところ。
|