From: WATANABE Hirofumi Date: 2000-07-27T13:08:30+09:00 Subject: [ruby-dev:10430] Re: environment variables わたなべです. "Nobuyoshi.Nakada" writes: : etc.so も rb_eArgError とかは見てるはずだと思うのですが。というか私の ですね. 要するに実際にグローバル変数にアクセスした時点で SEGV るわけか. % ruby -retc -e 'Etc::getpwuid 10' -e:1: [BUG] Segmentation fault ruby 1.5.5 (2000-07-25) [i386-cygwin] 0 [sig] ruby 4670 stackdump: Dumping stack trace to ruby.exe.stackdump :作ったやつだとしっかりインポートしてるんですが、わたなべさんのはインポー :トしてるシンボル自体が非常にというより異様に少なかったりシンボルについて :る番号(?)が 0 だったりしてます。 うちのは binutils-20000625 だからかな. [ruby-list:23970] のバグは [cygwin-jpn:00275] で直しました. #ってこれは参照できないか. http://yt.com/ml/lists/c/cygwin.html % ruby -i~ -pe 'gsub(/dyn_string_append/) do $& + "_cstr" end' \ binutils-20000625/binutils/dll*.c :> ActivePerl とか Tcl/Tk 8.1 以降の stub とかやっぱりそういう :> ことなんだなあとつくづく思う. : : これってどういうことしてるんでしょう。 Tcl の tclDecls.h を見ればわかると思います. 拡張ライブラリを作るときに -lruby がなくてもいいようにする方 法です. 提供したい関数のポインタ等を構造体にまとめて, Init_foo の引数にその構造体のポインタを渡すことで, 外部シン ボル参照を一切やめてしまうわけです. この方法の利点は以下の点です. 1. 新たに提供したい関数が増えたら構造体の最後に追加すること で, ある程度バイナリ互換が保てる. 関数名を変えても関係ない. 関数名がぶつかることもない. 2. Windows のように DLL の名前にしばられているような状況から も解放されるので, 好きなように名前をつけられる. 3. stdio とか使わなければ cygwin と mswin32 と共用の拡張ライ ブラリも可能のような気がする(まゆつば). 不利な点は 1. ちょっと遅くなること. 2. ちょっと複雑になること. があげられます. 実際はマクロを使うので拡張ライブラリ側は Init_foo に引数を追 加して, ruby_stubinit のようなものを呼ぶだけという変更ででき ると思います. ruby 本体側はちょっと大変かも. でもやる価値は あると思います. #てゆうかすでに実験する気になっている. ちょっと前に FreeBSD でも apache と mod_ruby で undefined に なってしまうという問題が起きましたが, これも似たようなもので すね. -- わたなべひろふみ