From: nobu.nakada@... Date: 2002-11-13T01:22:36+09:00 Subject: [ruby-dev:18756] Re: reference to symbols in other ext. libraries なかだです。 At Sun, 10 Nov 2002 19:12:09 +0900, Hiroshi IGARASHI wrote: > > > > つまり(GCCかつ)GNU ldかつ--enable-sharedのときだけ > > > > -z defsか--no-undefinedを追加するという方向で。 > > > > > > これを追加すると、他の拡張ライブラリ中のシンボルを参照している > > > 拡張ライブラリのリンク時にもエラーになってしまいます。 > > > # 具体的にはRuby/GNOME2で困っています。 > > > > と思ってextmk.rbで作るときだけにしたんですが、なんかいつのま > > にかmkmf.rbで作るときも有効になってますね。そっか、 > > create_makefileをmkmf.rbへmergeしたときか。 > > 配慮して下さってたんですね。 すいません、うっかりしてました。これは戻しましょうか。しかし extmk.rbとmkmf.rbで分けるというのもあまりすっきりしなくはあるの ですが。 > > それはそれとして、できれば他の拡張ライブラリのシンボルを参照 > > しないで済む方法考えてください。今のところ移植性が失われます。 > > > > これを根本的に解決するにはEXTERNの仕組みを変更するとか結構面倒です。 > > そうですか。危ういやり方であるとは認識していましたが。 > 思いつく解決法は次の2つくらいですが、どうでしょうか? > 「EXTERNの仕組み」というのを全然理解していないので、 > 解決法になってないのかもしれませんが。 たぶんWindowsのDLLのシンボルが、import/exportのように対称的じゃ ないという話じゃないかと思いますが。 > * libruby(にある何らかの関数・変数)を介して明示的にシンボルを > 登録・検索できるようにする。例えば、ポインタを適当にラップ > して、GCされないようにしたHashオブジェクトに突っ込むなど。 これでよければ、classなりmodule自身のインスタンス変数とか定数と かでできそうです。 > * 他の拡張ライブラリに見せる部分は独自のDLLにしてインストール。 > 参照する側の拡張ライブラリではlibrubyに加えこのDLLもリンクする。 > リンク時にシンボル解決ができるのは嬉しいが、別DLLを作る方法が問題。 これだとEXTERNの問題は解決しないかも知れません。 Index: configure.in =================================================================== RCS file: /cvs/ruby/src/ruby/configure.in,v retrieving revision 1.150 diff -u -2 -p -r1.150 configure.in --- configure.in 24 Oct 2002 12:58:41 -0000 1.150 +++ configure.in 12 Nov 2002 16:20:32 -0000 @@ -1054,5 +1054,4 @@ if test "$enable_shared" = 'yes'; then LIBRUBY_DLDFLAGS='-Wl,-soname,lib$(RUBY_SO_NAME).so.$(MAJOR).$(MINOR)' LIBRUBY_ALIASES='lib$(RUBY_SO_NAME).so.$(MAJOR).$(MINOR) lib$(RUBY_SO_NAME).so' - test "$rb_cv_prog_gnu_ld" = yes && DLDFLAGS="$DLDFLAGS -Wl,-no-undefined" ;; gnu*) Index: ext/extmk.rb =================================================================== RCS file: /cvs/ruby/src/ruby/ext/extmk.rb,v retrieving revision 1.15 diff -u -2 -p -r1.15 extmk.rb --- ext/extmk.rb 4 Nov 2002 15:47:35 -0000 1.15 +++ ext/extmk.rb 12 Nov 2002 16:20:14 -0000 @@ -42,4 +42,8 @@ def extmake(target) init_mkmf + if /linux/ =~ RUBY_PLATFORM and $configure_args['--enable-shared'] and CONFIG["GNU_LD"] == "yes" + $DLDFLAGS << " -Wl,-no-undefined" + end + begin dir = Dir.pwd -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦