From: Katsuyuki Komatsu Date: 1999-04-14T22:28:52+09:00 Subject: [ruby-dev:6616] ruby-1.3.2-990413 AIX patch はじめまして。 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