OSXでDYLD_LIBRARY_PATHを設定する意味がわからない
背景
node-ffiがNode.jsの0.11系に対応したので、node-ffiでlibavformatを叩こうとコードを書いたら、Linuxでは動きそうなものの、OSXではセグフォ喰らったので、そもそも、共有ライブラリの読み込みが上手く行っているのか確かめるべくdlopenなコードをローカルの環境で試すことに 以降の記述はフレームワークは扱わない、dylibなライブラリに限定。
LD_LIBRARY_PATHだけで良さそう
ちょっとググると、OSXはDYLD_LIBRARY_PATHで共有ライブラリのパスを指定できる旨の情報に辿り着く。 しかし、どうもDYLD_LIBRARY_PATHは設定すると不幸になるとの記述も散見される。
man dlopen
第一引数でパスを指定しないと、LD_LIBRARY_PATHを優先して、その次にDYLD_LIBRARY_PATHが 参照され、次がカレントで、DYLD_FALLBACK_LIBRARY_PATHが設定されていれば、これが参照。ここで、DYLD_FALLBACK_LIBRARY_PATH未設定の場合
- ~/lib
- /usr/local/lib
- /usr/lib
の順番で参照されるとのこと。 第一引数でパスを指定(/の有無で判定)した場合、DYLD_LIBRARY_PATHが真っ先に参照、その後、引数のパス、DYLD_FALLBACK_LIBRARY_PATHが参照され、この場合、LD_LIBRARY_PATHが参照されることはない。
悪用には便利?
setuid,setgidする実行ファイルはこれらの環境変数が適応されない。 この説明だと、ライブラリ名のみの指定の場合、どこを探すのか気になるが、残念ながら今日は時間が無いので、実験はそのうち。
まとめ
GNUなどのフリーソフト系のライブラリのパスはLD_LIBRARY_PATHで十分で、Cocoa API使ったモノは場合によってはDYLD_FALLBACK_LIBRARY_PATHを設定すると良いのかも。 DYLD_FALLBACK_LIBRARY_PATHを恒久的に設定する場合は、~/lib:/usr/local/lib:/usr/libも含めておくのが安全そうだ。
いつかの未来の時点での追記
tensorflow使うときはmacOSとよぶようになったOSでは/usr/local/libにコピーするしかない。LD_LIBRARY_PATH、DYLD_LIBRARY_PATHは無効になっている。
関連記事
- 俺がlibh2oの記事を読んで学んだこと #osx #dylib
- Atom ShellでCocoa APIが叩けるようになった
- WindowsでDLLを作ろうとしてmrb_context_runの歴史を調べた
- Node.jsのネイティブモジュールでも使われているdlopen時に関数を実行する指定方法