著作一覧 |
odzさんのおかげで一応解決した(らしい。元のレポートしてくれた人も解決したとメールを寄越して来た)。どうもありがとうございました。 でも、コメントを読むと結構、僕自身が間違えてる点があるのでまとめておく。
LD_PRELOADは、指定された共用オブジェクトを先にロードする。「リンクと同名のシンボル」参照。
どうも、rubyの実行過程でロードする共用オブジェクトの中にAmd64版Java5付属のlibzip.soと同名のシンボルを持つものがあるようだ。(バージョン違いとか書いているけどそれはだから的外れでした。SunのJava実装でx86-64とia64版ではシンボルを内部化してないというような指摘をしている投稿を誤読してた)
で、どのあたりが衝突してるのかとstraceで調べると、requireすべてについてsoを調べてE_NOENTになるもので、すさまじい量だ……でも、Ruby の共用オブジェクトが外部に出しているシンボルってInit_*しか無いように思うのだが。……rjbを作る時、ついCはフラットなネームスペースというのを忘れてcreate_jvmみたいな名前をexternにしてるな、とその行為の意味を思い出してぞっとしたり。とういかso化前提のプログラムならリンケージが不要な関数とかはすべてstaticにしなきゃならない。rjb自身が犯人かも。
$ nm -D rjbcore.so|grep T 0000875c T Init_rjbcore 000089f0 T Java_jp_co_infoseek_hp_arton_rjb_RBridge_call 0000aa18 A _GLOBAL_OFFSET_TABLE_ 00008cfc T _fini 00001a88 T _init 00002e00 T attach_current_thread 00002c8c T check_exception 00002470 T create_jvm 000029b8 T exticonv_cc 00002938 T exticonv_local_to_utf8 00002978 T exticonv_utf8_to_local 00002a00 T exticonv_vv 0000731c T find_class 00002a90 T get_exception_class 0000229c T load_bridge 00002e38 T release_string 00002b78 T rjb_s_throw
1.0.2の次は1.1.0にして(どうせrjb内部でしかリンケージを取ってないんだから1.0.3でも問題ないか)不要な関数はstaticを付けて、リンケージが必要な関数にはrjbあたりをprefixしよう。というかすぐにしておくか。
あとjava-linuxの投稿で結局解決せず、別のエラーとなったというのは、利用しているシンボルが今度はlibzip.soのものに変わったのが原因でしょう。
追記:rjb-1.0.3をリリースしました(exticonvは十分分離されてると思うので取りあえず現状維持)。(これでAmd64問題が解決するかどうかは別問題)
00007cfc T Init_rjbcore 00007fb4 T Java_jp_co_infoseek_hp_arton_rjb_RBridge_call 0000a914 A _GLOBAL_OFFSET_TABLE_ 00008bfc T _fini 00001974 T _init 000022d8 T exticonv_cc 00002258 T exticonv_local_to_utf8 00002298 T exticonv_utf8_to_local 00002320 T exticonv_vv 000023b0 T rjb_attach_current_thread 0000846c T rjb_check_exception 00008980 T rjb_create_jvm 000068bc T rjb_find_class 00008270 T rjb_get_exception_class 000023e8 T rjb_release_string 00008358 T rjb_s_throw
ジェズイットを見習え |