From: KUBO T. <ku...@ji...> - 2002-08-25 14:00:29
|
久保@茅ヶ崎市です。 掟破りの ruby-gnome-users-ja 飛ばし。 # 英語で書くの面倒だったので.....。m(__)m Linux で未定義の変数・関数を含む共有ライブラリを dlopen したときの動作 をチェックしてみたところ、 第二引数のフラグ| 未定義の変数 | 未定義の関数 -----------------+---------------------+----------------------- RTLD_LAZY |dlopen 時にエラー(*1)|参照時にエラー(*2) RTLD_NOW |dlopen 時にエラー(*1)|dlopen 時にエラー(*1) *1: dlopen が NULL で戻り、dlerror() の戻り値は 共有ライブラリ名: undefined symbol: 未定義のシンボル名 となる。 *2: dlopen は成功するが、未定義の関数を含む関数を実行すると relocation error: 共有ライブラリ名: undefined symbol: 未定義のシンボル名 と標準エラーに出力され、そこでプロセス終了。 という結果になりました。 つまり、Linux では、RTLD_LAZY が効くのは関数に関してだけで、変数に関し ては効果なしということですね。 ちなみに、ruby で共有ライブラリをロードするときは、デフォルトで、 RTLD_LAZY でもって dlopen しています。 # dlopen のあるプラットフォームのみですけど。 KUBO Takehiro <ku...@ji...> writes: >>> (1) gnome_canvas_item_scale unresolved >>> >>> /usr/local/lib/ruby/site_ruby/1.6/gnome.rb:3:in `require': dlopen: /usr/local/lib/ruby/site_ruby/1.6/alpha-osf5.1/gnome.so: symbol "gnome_canvas_item_scale" unresolved - /usr/local/lib/ruby/site_ruby/1.6/alpha-osf5.1/gnome.so (LoadError) >>> from /usr/local/lib/ruby/site_ruby/1.6/gnome.rb:3 >>> from ./test.rb:1:in `require' >>> from ./test.rb:1 Tru64 の場合、変数に対しても関数に対しても RTLD_LAZY が効かずに、ロー ド時にすべてのシンボルを解決しようとしているのでしょう。 >> Hmm, At least, in my environment(Linux/gnome-libs-1.4.1.2) it works fine. Linux の場合は、未定義の関数は実行時までわからないので、この時点ではま だ問題はわからない。 Linux で状況を再現させるにはロード時にすべてのシンボルを解決させるよう にすれば良い。 > How about recompile ruby with the following patch and test Ruby-GNOME > if your platform's ruby uses dlopen. > > ============================================== > --- dln.c.orig Fri Aug 24 15:35:24 2001 > +++ dln.c Wed Aug 21 00:12:30 2002 > @@ -1273,7 +1273,7 @@ > #endif > > /* Load file */ > - if ((handle = (void*)dlopen(file, RTLD_LAZY|RTLD_GLOBAL)) == NULL) { > + if ((handle = (void*)dlopen(file, RTLD_NOW|RTLD_GLOBAL)) == NULL) { > goto failed; > } > ============================================== というわけで、ruby 本体へパッチをあてて、未定義の関数がないかどうかチェッ クしまくったわけです。 では、再見 -- 神奈川県茅ヶ崎市在住 久保 健洋 email: ku...@ji... web: http://www.jiubao.org GnuPG fingerprint = 5F7B C8EF CA16 57D0 FDE1 9F47 C001 1F93 AC08 2262 |