藤本です、こんにちは。

  うちでもようやくBeOS R3が動くようになった(PowerPC版とIntel版の両方と
も)ので、1.1b9_22に前田さんの[ruby-dev:2708]のパッチをあてて作ってみま
した。PowerPC版を作るときに多少の修正が必要だったので、パッチをメール
の最後に添付します。両バージョンで簡単な動作確認(make test)をしてます。

  変更点は、

    BeOS R3 for PowerPC版で、シンボル名ファイルのsuffixが、.expでない
    といけないみたいなので、それに合わせてconfigureとext/extmk.rb.inを
    修正

    BeOSで、C++で書いた拡張モジュールの初期化関数呼び出しに対応(dln.c)

です。パッチは、ruby-1.1b9_22.tar.gzに前田さんの[ruby-dev:2708]のパッ
チを当てたものとの差分にしてあります。

#こういうときruby-1.1b9_22.tar.gzとの差分にするのとどっちの方が良い
#のでしょう?

  BeOSでコンパイル時の警告を減らしたいので、MakefileのCFLAGSから
-I${prefix}/includeを取り除きたかったのですが、書き方がよくわからなかっ
たので断念しました (^^;

それから

From: "MAEDA Shugo" <shugo / aianet.ne.jp>
Subject: [ruby-dev:2708] Re: experimental release 1.1b9_21
Date: Wed, 20 May 1998 06:35:38 +0900

> 前田です。
> 
> irb(main):001:0> require 'kconv'
> true
> irb(main):002:0> require 'socket'
> (irb):2: [BUG] Segmentation fault
> Abort
> 
> のようにkconvだとOKなのですが、socketだとNGです:-(
> # socketの場合libnetをリンクしてるせいなのかな...。

  について原因追求はしてないのですが、現象としてはrb_define_class()を
呼ぶときにNGになるみたいです。単純に

Init_testmodule()
{
  rb_define_module("TestModule");
}

のような拡張モジュールはOKですが

Init_testmodule()
{
  rb_define_class("TestClass", cObject);
}

だとNGになります。さらにこの問題が起きるのはなぜかIntel版だけみたいで、
PowerMac版はどちらもOKです。

=============================================================
 藤本尚邦  FUJIMOTO Hisakuni                hisa / imasy.or.jp
=============================================================

diff -ru ruby-1.1b9_22-maeda/configure ruby-1.1b9_22-maeda-hisa/configure
--- ruby-1.1b9_22-maeda/configure	Tue May 26 12:10:44 1998
+++ ruby-1.1b9_22-maeda-hisa/configure	Tue May 26 12:21:33 1998
@@ -3486,10 +3486,10 @@
 	beos*) 		LDSHARED="ld -xms"
 			case "$host_cpu" in
 			  powerpc*)
-			    DLDFLAGS="-f ruby.def -lbe -lroot -ldll"
+			    DLDFLAGS="-f ruby.exp -lbe -lroot glue-noinit.a init_term_dyn.o start_dyn.o"
                             ;;
 			  *)
-			    DLDFLAGS="ruby.def -lbe -lroot /boot/develop/lib/x86/glue-noinit.a"
+			    DLDFLAGS="ruby.def -lbe -lroot glue-noinit.a init_term_dyn.o start_dyn.o"
 			    ;;
 			esac
 			rb_cv_dlopen=yes ;;
@@ -3863,7 +3863,7 @@
   echo creating ruby.def
   case "$host_cpu" in
     powerpc*)
-      cp beos/ruby.def.in ruby.def
+      cp beos/ruby.def.in ruby.exp
       ;;
     *)
       echo EXPORTS > ruby.def
diff -ru ruby-1.1b9_22-maeda/dln.c ruby-1.1b9_22-maeda-hisa/dln.c
--- ruby-1.1b9_22-maeda/dln.c	Tue May 26 12:05:32 1998
+++ ruby-1.1b9_22-maeda-hisa/dln.c	Tue May 26 12:21:40 1998
@@ -1365,6 +1365,14 @@
       err_stat = get_image_symbol(img_id, buf,
 				  B_SYMBOL_TYPE_TEXT, &init_fct);
 
+      if (err_stat != B_NO_ERROR) {
+	    char real_name[1024];
+	    strcpy(real_name, buf);
+	    strcat(real_name, "__Fv");
+        err_stat = get_image_symbol(img_id, real_name,
+				  B_SYMBOL_TYPE_TEXT, &init_fct);
+      }
+
       if ((B_BAD_IMAGE_ID == err_stat) || (B_BAD_INDEX == err_stat)) {
 	unload_add_on(img_id);
 	LoadError("Failed to lookup Init function %.200s", file);
diff -ru ruby-1.1b9_22-maeda/ext/extmk.rb.in ruby-1.1b9_22-maeda-hisa/ext/extmk.rb.in
--- ruby-1.1b9_22-maeda/ext/extmk.rb.in	Tue May 26 12:11:05 1998
+++ ruby-1.1b9_22-maeda-hisa/ext/extmk.rb.in	Tue May 26 12:21:49 1998
@@ -356,8 +356,13 @@
   mfile.close
   
   if PLATFORM =~ /beos/
+    if PLATFORM =~ /^powerpc/ then
+      deffilename = "ruby.exp"
+    else
+      deffilename = "ruby.def"
+    end
     print "creating ruby.def\n"
-    open("ruby.def", "w") do |file|
+    open(deffilename, "w") do |file|
       file.print("EXPORTS\n") if PLATFORM =~ /^i/
       file.print("Init_#{target}\n")
     end
diff -ru ruby-1.1b9_22-maeda/ruby.h ruby-1.1b9_22-maeda-hisa/ruby.h
--- ruby-1.1b9_22-maeda/ruby.h	Tue May 26 12:05:33 1998
+++ ruby-1.1b9_22-maeda-hisa/ruby.h	Tue May 26 13:06:27 1998
@@ -499,8 +499,8 @@
 static char *libs_to_be_linked[] = { EXTLIB, 0 };
 #endif
 
-#endif
-
 #if defined(__cplusplus)
 }  /* extern "C" { */
 #endif
+
+#endif /* ifndef RUBY_H */