ユニバーサルバイナリを作ってみる 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$

これをインストールすれば、おわり。