トップ «前の日記(2006-11-20) 最新 次の日記(2006-11-22)» 編集

日々の破片

Subscribe with livedoor Reader
著作一覧

2006-11-21

_ RjbとInternalError(続)

odzさんのおかげで一応解決した(らしい。元のレポートしてくれた人も解決したとメールを寄越して来た)。どうもありがとうございました。 でも、コメントを読むと結構、僕自身が間違えてる点があるのでまとめておく。

  1. 問題となった現象はAmd64版Linux + Java 5 で発生する
  2. RjbでjarからimportしようとするとInternalErrorがスローされる。
  3. このjarを普通にJavaコマンドで利用することは可能。
  4. (環境によっては)Railsを先にロードすると発生する。
回避策
  1. jarの圧縮を解除すれば発生しない。したがって、圧縮なしでjarし直せば回避できる
  2. Java5に含まれるlibzip.soをLD_PRELOADすれば回避できる

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

2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|

ジェズイットを見習え