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

| | トラックバック(0)

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 のようにバージョン番号を指定しなくてもリンクできるようになってます。

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

トラックバック(0)

このブログ記事を参照しているブログ一覧: Mac OS X のライブラリの形式は ELF ではなく Mach-O らしい

このブログ記事に対するトラックバックURL: http://blog.bz2.jp/bz2mt/mt-tb.cgi/165

ウェブページ

Powered by Movable Type 4.21-ja

このブログ記事について

このページは、masatoが2006年10月 9日 17:28に書いたブログ記事です。

ひとつ前のブログ記事は「Mac OS X に memcached をインストールして launchd で自動起動するようにした」です。

次のブログ記事は「Mac OS X 10.4, Xcode 2.4 では gcc-3.3 が使えない」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。