[#6617] Re: IPv6 ruby — Jun-ichiro itojun Hagino <itojun@...>

26 messages 1999/04/15
[#6672] Re: IPv6 ruby — matz@... (Yukihiro Matsumoto) 1999/04/28

まつもと ゆきひろです

[#6673] Re: IPv6 ruby — itojun@... 1999/04/28

[#6674] Re: IPv6 ruby — matz@... (Yukihiro Matsumoto) 1999/04/28

まつもと ゆきひろです

[#6675] Re: IPv6 ruby — itojun@... 1999/04/28

[#6676] Re: IPv6 ruby — matz@... (Yukihiro Matsumoto) 1999/04/28

まつもと ゆきひろです

[#6677] Re: IPv6 ruby — itojun@... 1999/04/28

[ruby-dev:6616] ruby-1.3.2-990413 AIX patch

From: Katsuyuki Komatsu <komatsu@...>
Date: 1999-04-14 13:28:52 UTC
List: ruby-dev #6616
はじめまして。

AIXで拡張モジュールが使えないのは寂しいので、perlのソースを
みながらパッチを作成しました。

とりあえず動いてるみたいです。

現状では、ext/の下以外でモジュールを作成できませんが、
    rbconfig.rbとaix_ld.rbをインストールした場合とソースの下で変える
    ruby.impをインストールする
みたいなことをしないとならないので、どうしたらいいか……

% echo `uname -s; oslevel`
AIX 4.1.3.0
% cat sum.rb
require "md5"
puts MD5.new(open("sum.rb", "rb").read).digest.unpack("H*")
% ruby -v sum.rb
ruby 1.3.2 (1999-04-13) [rs6000-aix4.1.3.0]
4ce8302f09d7e4a4ada88f44025019e5
% ruby -r md5 -e 'puts MD5.new(open("sum.rb", "rb").read).digest.unpack("H*")'
4ce8302f09d7e4a4ada88f44025019e5
% 

(ここでmd5.soを別な名前に変更)

% ruby -v sum.rb
ruby 1.3.2 (1999-04-13) [rs6000-aix4.1.3.0]
sum.rb:1:in `require': No such file to load -- md5 (LoadError)
	from sum.rb:1
% 

	/	/	/

diff -u Makefile.in.dist Makefile.in
--- Makefile.in.dist	Tue Mar 30 14:58:13 1999
+++ Makefile.in	Wed Apr 14 13:36:33 1999
@@ -18,6 +18,7 @@
 LIBS = @LIBS@ $(EXTLIBS)
 MISSING = @LIBOBJS@ @ALLOCA@
 LDSHARED = @LDSHARED@
+CCDLDFLAGS = @CCDLDFLAGS@
 DLDFLAGS = @DLDFLAGS@
 SOLIBS = @SOLIBS@
 
@@ -89,7 +90,7 @@
 
 $(PROGRAM):     	$(LIBRUBY) $(MAINOBJ) $(EXTOBJS) 
 		@rm -f $@
-		$(PURIFY) $(CC) $(LDFLAGS) $(MAINOBJ) $(EXTOBJS) $(LIBRUBYARG) $(LIBS) -o $@
+		$(PURIFY) $(CC) $(LDFLAGS) $(CCDLDFLAGS) $(MAINOBJ) $(EXTOBJS) $(LIBRUBYARG) $(LIBS) -o $@
 
 $(LIBRUBY_A):	$(OBJS) dmyext.o
 		@AR@ rcu $@ $(OBJS) dmyext.o
diff -u configure.in.dist configure.in
--- configure.in.dist	Tue Mar 30 16:32:56 1999
+++ configure.in	Wed Apr 14 12:33:16 1999
@@ -346,6 +346,7 @@
   fi;;
 esac
 
+AC_SUBST(CCDLDFLAGS)dnl
 AC_SUBST(DLDFLAGS)dnl
 
 AC_SUBST(STATIC)dnl
@@ -434,6 +435,7 @@
 			DLDFLAGS="$ARCH_FLAG"
 			rb_cv_dlopen=yes ;;
 	aix*)		LDSHARED='../../miniruby ../aix_ld.rb $(TARGET)'
+			CCDLDFLAGS="-Wl,-bE:ext/ruby.imp"
 			rb_cv_dlopen=yes ;;
 	human*)		DLDFLAGS=''
 			LDSHARED=''
diff -u dln.c.dist dln.c
--- dln.c.dist	Fri Apr  9 18:19:15 1999
+++ dln.c	Wed Apr 14 13:14:35 1999
@@ -1155,6 +1155,35 @@
 
 
 #if defined(_AIX)
+static void *
+aix_findmain()
+{
+    struct ld_info *lp;
+    char *buf;
+    int size = 4 * 1024;
+    int rc;
+    void *ret;
+
+    if ((buf = xmalloc(size)) == NULL) {
+	return NULL;
+    }
+    while ((rc = loadquery(L_GETINFO, buf, size)) == -1 && errno == ENOMEM) {
+	free(buf);
+	size += 4 * 1024;
+	if ((buf = xmalloc(size)) == NULL) {
+	    return NULL;
+	}
+    }
+    if (rc == -1) {
+	free(buf);
+	return NULL;
+    }
+    lp = (struct ld_info *)buf;
+    ret = lp->ldinfo_dataorg;
+    free(buf);
+    return ret;
+}
+
 static void
 aix_loaderror(const char *pathname)
 {
@@ -1310,10 +1339,19 @@
 #if defined(_AIX)
 #define DLN_DEFINED
     {
+	static void *main_module = NULL;
 	void (*init_fct)();
 
-	init_fct = (void(*)())load(file, 1, 0);
+	if (main_module == NULL) {
+	    if ((main_module = aix_findmain()) == NULL) {
+		aix_loaderror(file);
+	    }
+	}
+	init_fct = (void(*)())load((char*)file, 1, 0);
 	if (init_fct == NULL) {
+	    aix_loaderror(file);
+	}
+	if (loadbind(0, main_module, init_fct) == -1) {
 	    aix_loaderror(file);
 	}
 	(*init_fct)();
diff -u ext/aix_ld.rb.dist ext/aix_ld.rb
--- ext/aix_ld.rb.dist	Wed Jan 20 13:59:32 1999
+++ ext/aix_ld.rb	Wed Apr 14 09:00:41 1999
@@ -38,14 +38,15 @@
   data = nm.readlines.collect{|line|
     line = line.split
     case line[1]
-    when "B", "D", "T"
-      line[2]
+    when "B", "D"
+      line[0]
     else
       next
     end
   }.compact!.sort!
   uniq(data)
   exp = open(out, "w")
+  exp.printf "#!\n"
   for line in data
     exp.printf "%s\n", line
   end
@@ -53,21 +54,14 @@
   nm.close
 end
 if older("../ruby.imp", "../../miniruby")
-#  nm = open("|/usr/ccs/bin/nm -Bex ../../*.o")
-#  nm = open("|/usr/ccs/bin/nm -Bex ../../*.o")
-  nm = open("|nm ../../*.o")
+  nm = open("|/usr/ccs/bin/nm -p ../../*.o")
   extract(nm, "../ruby.imp")
 end
 
-objs = Dir["*.o"].join(" ")
-#nm = open("|/usr/ccs/bin/nm -Bex #{objs}")
-nm = open("|nm #{objs}")
-extract(nm, "#{base}.exp")
+#objs = Dir["*.o"].join(" ")
+#nm = open("|/usr/ccs/bin/nm -p #{objs}")
+#extract(nm, "#{base}.exp")
 
-#system format("/usr/ccs/bin/ld %s %s ",ldargs,ARGV.join(' '))
-#system "/bin/rm -f #{base}.exp"
-#system "chmod o-rwx ${base}.so"
-
-p format("/usr/ccs/bin/ld %s %s ",ldargs,ARGV.join(' '))
-p "/bin/rm -f #{base}.exp"
-p "chmod o-rwx ${base}.so"
+cmd = format("/usr/ccs/bin/ld %s %s ", ldargs, ARGV.join(' '))
+printf "\t%s\n", cmd
+system cmd

--
小松克行 (株)サリオンシステムズリサーチ ソフトウェア開発部
Katsuyuki Komatsu <komatsu@sarion.co.jp>

In This Thread

Prev Next