non vorrei lavorare

昔はおもにプログラミングやガジェット系、今は?

OSXでDYLD_LIBRARY_PATHを設定する意味がわからない

おはようございます。3連休中2日間仕事だった奥さんは、週明け休みで子どもたちとのんびり過ごそうとしていたようだったのですが、長男がどうしても京王れーるランドに行きたい!ということで、京王れーるランドに行って、楽しんで帰って来ました。@kjunichiです。
 

背景

node-ffiがNode.jsの0.11系に対応したので、node-ffilibavformatを叩こうとコードを書いたら、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は無効になっている。

関連記事

7年前の記事