ユニバーサルバイナリを作ってみる ruby編補足
昨日の検索では引っかかってこなかったファイルもユニバーサルバイナリ化しないといけない雰囲気。これ
MyMac:~ chcoopu$ file /usr/local/ruby/lib/libruby-static.a /usr/local/ruby/lib/libruby-static.a: current ar archive random library MyMac:~ chcoopu$
Mach-O形式として出てこなかったから見落としていた。libruby-static.aを展開してみると
MyMac:libruby chcoopu$ ls -a ./ ../ MyMac:libruby chcoopu$ MyMac:libruby chcoopu$ cp /usr/local/ruby/lib/libruby-static.a ./ MyMac:libruby chcoopu$ ar x libruby-static.a MyMac:libruby chcoopu$ ls __.SYMDEF SORTED hash.o re.o array.o inits.o regex.o bignum.o io.o ruby.o class.o libruby-static.a signal.o compar.o marshal.o sprintf.o dir.o math.o st.o dln.o numeric.o string.o dmyext.o object.o struct.o enum.o pack.o time.o enumerator.o parse.o util.o error.o prec.o variable.o eval.o process.o version.o file.o random.o gc.o range.o MyMac:libruby chcoopu$
ほら、i386なバイナリが出てきた。本当はこのlibruby-static.aもユニバーサルバイナリにしないといけない。
MyMac:libruby chcoopu$ file *.o array.o: Mach-O object i386 bignum.o: Mach-O object i386 class.o: Mach-O object i386 compar.o: Mach-O object i386 dir.o: Mach-O object i386 dln.o: Mach-O object i386 dmyext.o: Mach-O object i386 enum.o: Mach-O object i386 error.o: Mach-O object i386 eval.o: Mach-O object i386 file.o: Mach-O object i386 gc.o: Mach-O object i386 hash.o: Mach-O object i386 inits.o: Mach-O object i386 io.o: Mach-O object i386 marshal.o: Mach-O object i386 math.o: Mach-O object i386 numeric.o: Mach-O object i386 object.o: Mach-O object i386 pack.o: Mach-O object i386 parse.o: Mach-O object i386 prec.o: Mach-O object i386 process.o: Mach-O object i386 random.o: Mach-O object i386 range.o: Mach-O object i386 re.o: Mach-O object i386 regex.o: Mach-O object i386 ruby.o: Mach-O object i386 signal.o: Mach-O object i386 sprintf.o: Mach-O object i386 st.o: Mach-O object i386 string.o: Mach-O object i386 struct.o: Mach-O object i386 time.o: Mach-O object i386 util.o: Mach-O object i386 variable.o: Mach-O object i386 version.o: Mach-O object i386 MyMac:libruby chcoopu$
まぁここまでできていたら、単にこれもi386バイナリなファイルとx86_64バイナリなファイルを用意してくっつければいいだけ。
MyMac:libruby chcoopu$ lipo -create libruby-static.a.i386 libruby-static.a.x86_64 -output libruby-static.a MyMac:libruby chcoopu$
ほいできた。
……しかし、よく考えたら名前の通り静的ライブラリだな、これ。arでファイル取り出せるし。
それじゃ、動的共有ライブラリで作り直すか。
いつものようにi386なバイナリ作る準備して、configure時に--enable-sharedオプションを付けるだけ。
すると、こんな感じで動的共有ライブラリが作られる。
MyMac:ruby-1.8.6-p287 chcoopu$ ls -l libruby* -rw-r--r-- 1 chcoopu staff 1276776 12 2 00:03 libruby-static.a -rwxr-xr-x 1 chcoopu staff 844844 12 2 00:03 libruby.1.8.6.dylib* lrwxr-xr-x 1 chcoopu staff 19 12 2 00:03 libruby.1.8.dylib@ -> libruby.1.8.6.dylib lrwxr-xr-x 1 chcoopu staff 19 12 2 00:03 libruby.dylib@ -> libruby.1.8.6.dylib MyMac:ruby-1.8.6-p287 chcoopu$ file libruby.1.8.6.dylib libruby.1.8.6.dylib: Mach-O dynamically linked shared library i386 MyMac:ruby-1.8.6-p287 chcoopu$
そしてまたお決まりのようにx86_64バイナリを--enable-sharedで作ってユニバーサルバイナリを作り出すと。
MyMac:ruby-1.8.6-p287 chcoopu$ file libruby.1.8.6.dylib libruby.1.8.6.dylib: Mach-O universal binary with 2 architectures libruby.1.8.6.dylib (for architecture i386): Mach-O dynamically linked shared library i386 libruby.1.8.6.dylib (for architecture x86_64): Mach-O 64-bit dynamically linked shared library x86_64 MyMac:ruby-1.8.6-p287 chcoopu$
これをインストールすれば、おわり。