From: Kengo Nakajima Date: 2000-10-26T23:51:55+09:00 Subject: [ruby-list:25624] Re: require で so をロードするときの環境変数について 中嶋です。 さらに考えてみると、この問題はrubyの問題ではなく、 glibc の仕様?の問題のように思えます。 On Thu, 26 Oct 2000 21:53:31 +0900 nobu.nakada@nifty.ne.jp wrote: > なかだです。 > > At Thu, 26 Oct 2000 20:50:45 +0900, > Kengo Nakajima wrote: > > ruby では、 .so ファイルをrequire するときは、 dlopen を使っていますが、 > > dlopenは環境変数 LD_LIBRARY_PATH に設定されているパスをもとに検索を > > します。なので、require する前に、環境変数をいじって > > > > ENV["LD_LIBRARY_PATH"] = "/home/ringo/some/lib" > > require "hogehoge.so" > > > > のようにすれば、正しくロードされるかと思いきや、hogehoge.so は > > ロードされません。しかし、rubyを起動する前に、シェルから > > > > csh % setenv LD_LIBRARY_PATH /home/ringo/some/lib > > csh % ruby foo.rb > > > > という風にすると、ちゃんとロードされます。 > > ライブラリの初期化時にどっかに保存してるような気がします。  ということはENV(setenv)では保存されてしまっているものをいじっている ということでしょうか。 glibc のソースを見ないといけないかな。 > > > 最終的には、rubyのスクリプトの中でrequire する前に、 > > 何とかして環境変数を指定してrequireが成功するようにしたいです。 > > $:.unshift "/home/ringo/some/lib" とか。  そう、これだとRubyの中で閉じているので、.so が必要とする さらに別なso, たとえば mysql/ruby の mysql.o が要求する libmysqlclient.so などがロードでき なくて困るのです。  問題点がうまく伝えにくいですが、究極的には、glibcの setenv ライブラリ 関数で設定した LD_LIBRARY_PATH が、 同じプログラムの中の dlopen の 動作に影響を及ぼさない、ということです。 ---------- 中嶋謙互