btoメモ

なんか適当に書く

Mac OS X のライブラリの形式は ELF ではなく Mach-O らしい

Mac OS X のライブラリの形式は Mach-O という形式らしい。

Mach 由来の形式でしょうか。

Linux(他のUNIXも?) といろいろ違っていてちょっとしたカルチャーショックを受けてます。

/lib/ld.so がない

/lib/ld.so と言えば共有ライブラリをロードするためのライブラリですが、Mach-O では /lib/ld.so がありません。

当然 ldconfig もない。

ELF のバイナリは /lib/ld.so が共有ライブラリの検索を行うので、ライブラリへのリンクは絶対パスではなく soname(ライブラリのファイル名)で行われますが、Mach-O の場合は絶対パスでリンクされるようです。

Mac OS X では ldd コマンドはなく、otool -L が ldd に相当する機能を提供しているようです。

試しにさっきインストールした memcached がどのライブラリにリンクしてみるか調べてみました。

% otool -L /opt/memcached/bin/memcached

/opt/memcached/bin/memcached:

/opt/libevent/lib/libevent-1.1b.1.dylib (compatibility version 2.0.0, current version 2.2.0)

/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 88.3.4)

確かに絶対パスでリンクされてる。

ちなみに Linux での出力はこんな感じ。

% ldd /opt/memcached/bin/memcached

linux-gate.so.1 => (0x006c8000)

libevent-1.1a.so.1 => /usr/lib/libevent-1.1a.so.1 (0x00111000)

libc.so.6 => /lib/libc.so.6 (0x006e6000)

/lib/ld-linux.so.2 (0x006c9000)

/lib/ld-linux.so.2 以外は全て soname になってる。

ライブラリのファイル名は libhoge.x.y.z.dylib

ELF 形式の場合はファイル名は libhoge.so.x.y.z の用にバージョン番号が .so の後にきますが、Mach-O の場合はバージョン番号の後に .dylib がきます。

なので、-lhoge.x.y.z のように特定のバージョンのライブラリにリンクすることができる。これは便利。

libhoge.so -> libhoge.x.y.z.so のようなシンボリックリンクを使ってしかコンパイル時にリンクするライブラリのバージョンを変更する事ができない ELF 形式と比べると柔軟に対応できますね。

もちろんリンクするライブラリのバージョンを毎回指定するわけではなく、通常は libhoge.dylib -> libhoge.x.y.z.dylib のシンボリックリンクがはられているので、-lhoge のようにバージョン番号を指定しなくてもリンクできるようになってます。

直接役に立つ場面は少なそうですが...