中嶋と申します。

 .so ファイルを require するときの検索について質問させて下さい(linuxで)。

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

という風にすると、ちゃんとロードされます。

ruby のENVにおける "[]=" メソッドは、 setenv ライブラリ関数を呼び出す
ようになっているので、このことから予想されるのは、
setenv関数が、dlopen の認識できない領域を変更しているという事です。
これを検証しようとして、以下のようなC言語のプログラムを書いてみました。

#include <dlfcn.h>
int main(){
  void *h1, *h2;
  h1 = dlopen( "hogehoge.so" , RTLD_LAZY );
  setenv( "LD_LIBRARY_PATH", "/home/ringo/some/lib" );
  h2 = dlopen( "hogehoge.so" , RTLD_LAZY );
}
この実行結果は、 h1, h2 ともにNULLとなります。しかし、実行前に
シェルからLD_LIBRARY_PATH を設定すると、h1,h2ともに意味のある値を
返します。

 なぜこうなってしまうのか、わけがわからないのです。
教えていただければうれしいです。
最終的には、rubyのスクリプトの中でrequire する前に、
何とかして環境変数を指定してrequireが成功するようにしたいです。

では、よろしくおねがいします。

--------
中嶋謙互