主に IT 技術を整理するためにメモ的に書き溜めています。少しだけフリーソフトもあるよ。コメントを残すには、 facebook を使ってください。

Mac OSX で dylib などのライブラリ内のリンク情報を変更するには

最終更新日 2011-11-21 21:41:35 (1年以上前の記事です)

以前 rvm を Mac OSX にインストールして、いざ rails を実行すると、以下のようなリンクエラーが出る。

$ ./script/server start
dyld: lazy symbol binding failed: Symbol not found: _libiconv_open
  Referenced from: /usr/local/rvm/rubies/ruby-1.8.7-p334/lib/ruby/1.8/i686-darwin10.7.0/iconv.bundle
  Expected in: flat namespace

dyld: Symbol not found: _libiconv_open
  Referenced from: /usr/local/rvm/rubies/ruby-1.8.7-p334/lib/ruby/1.8/i686-darwin10.7.0/iconv.bundle
  Expected in: flat namespace

Trace/BPT trap

これは要するに iconv.bundle がリンクしている先の libiconv ライブラリに存在すべきシンボルが無いという旨のエラー。発生する原因は色々あると思うけど、多いのは独自にライブラリを ports や コンパイルなどでインストールして複数存在する場合に起こる事が多いと思う。
例えば今回の場合は、独自に libiconv を /usr/local にインストールしていたため、 rvm インストール時に使用されたライブラリと、いざ実行したさいにロードしようとしているライブラリが違ってしまっているためエラーが発生する。

解決方法がいくつかあったので、それをメモ。

DYLD_LIBRARY_PATH 環境変数で回避

一番楽で早いのは環境変数で読み込むライブラリの場所を指定してやる方法。
例えば今回の例で iconv.bundle のリンク先を otool で確認すると

$ otool -L /usr/local/rvm/rubies/ruby-1.8.7-p334/lib/ruby/1.8/i686-darwin10.7.0/iconv.bundle
/usr/local/rvm/rubies/ruby-1.8.7-p334/lib/ruby/1.8/i686-darwin10.7.0/iconv.bundle:
	/usr/local/rvm/rubies/ruby-1.8.7-p334/lib/libruby.dylib (compatibility version 1.8.0, current version 1.8.7)
	/usr/lib/libiconv.2.dylib (compatibility version 7.0.0, current version 7.0.0)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.10)
	/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 227.0.0)

となり、どうやら /usr/lib/libiconv.2.dylib を参照している模様。しかし本当にロードしなければいけないのは、 /usr/local/lib/libiconv.2.dylib なので、環境変数 DYLD_LIBRARY_PATH を以下のように指定するとエラーが回避できる。

$ export DYLD_LIBRARY_PATH=/usr/local/lib

ただしこの方法、毎回やるのは面倒だし、かと言って .bash_profile などに追加しておくと、他のアプリケーションが起動しなくなったりする。
なので、もうちょっと直接的な解決方法を考える。

install_name_tool でライブラリ内のリンク情報を置換

そもそもライブラリ内のリンク情報が間違っているのが問題なのだから、これを書き換えてしまえばいいのではないか?という事で、 install_name_tool を使って書き換えを行う。以下のコマンドを実行する。

$ install_name_tool -change "/usr/lib/libiconv.2.dylib" /usr/local/lib/libiconv.2.dylib /usr/local/rvm/rubies/ruby-1.8.7-p334/lib/ruby/1.8/i686-darwin10.7.0/iconv.bundle

そして再び otool で確認すると、

$ otool -L /usr/local/rvm/rubies/ruby-1.8.7-p334/lib/ruby/1.8/i686-darwin10.7.0/iconv.bundle/usr/local/rvm/rubies/ruby-1.8.7-p334/lib/ruby/1.8/i686-darwin10.7.0/iconv.bundle:
	/usr/local/rvm/rubies/ruby-1.8.7-p334/lib/libruby.dylib (compatibility version 1.8.0, current version 1.8.7)
	/usr/local/lib/libiconv.2.dylib (compatibility version 7.0.0, current version 7.0.0)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.10)
	/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 227.0.0)

書き変わってますね。では rails を再び実行してみる。

$ ./script/server start
=> Booting WEBrick
=> Rails 2.3.5 application starting on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
[2011-11-21 14:34:00] INFO  WEBrick 1.3.1
[2011-11-21 14:34:00] INFO  ruby 1.8.7 (2011-02-18) [i686-darwin10.7.0]
[2011-11-21 14:34:00] INFO  WEBrick::HTTPServer#start: pid=3506 port=3000

めでたく動きました。

最終更新日 2011-11-21 21:41:35

コメント このエントリーをはてなブックマークに追加

フリーソフトウエア
EnjoiFLV
EnjoiPacket
EnjoiCrypto
ランキング
rank2, rank3, rank7, rank10, rank11
todo メモ
facebook 対応
ページ処理
RSS feed
検索機能
認証いる?
更新日表示
実はカテゴリ機能
多言語
実はユーザ機能
ソースその内公開
動作環境メモ
php-5.1.6 with PDO
SQLite-3.3
IE6
FireFox-1.5
RSS
非認証

検索
Google