Ruby load problem on AIX

Hi,
I have built Ruby 1.8.5 on an AIX 5.2 64 bit machine. I am using
xlc with OBJECT_MODE=64. When I try to run the following:

$ gem install rails --include-dependencies
/fasthome/fast3/manas/ruby185/lib/ruby/1.8/powerpc-aix5.3.0.0/
socket.so: load failed - /fasthome/fast3/manas/ruby185/lib/ruby/1.8/
powerpc-aix5.3.0.0/socket.so Not enough spac (LoadError)
from /fasthome/fast3/manas/ruby185/lib/ruby/1.8/net/
protocol.rb:21

Any help or tips is appreciated.

Thanks in advance.

Regards,
-MD

Hi,

Have you resolved this issue?
I tried to investigate why load() failed, but I was not able to figure
out.

Attached patch is to change dln.c behavior not to use load() but
dlopen()
for AIX. This seemed to work in my environment.

% oslevel -s
5300-05-06

% ~/r185-64/bin/ruby -v -rsocket -e ‘p
IPSocket.getaddress(“www.ruby-lang.org”)’
ruby 1.8.5 (2006-08-25) [powerpc-aix5.3.0.0]
“221.186.184.68”

% ~/r185-64/bin/ruby -e ‘p 0xffffffff.class’
Fixnum

If you have any other solution, let me know.

2007/4/2, MD [email protected]:

Hi,

At Fri, 6 Apr 2007 17:43:13 +0900,
Yutaka K. wrote in [ruby-talk:246920]:

Attached patch is to change dln.c behavior not to use load() but dlopen()
for AIX. This seemed to work in my environment.

I eventually found this thread.

  •                       DLDFLAGS='-Wl,-G -eInit_$(TARGET)'
    
  •                       LDFLAGS='-Wl,-brtl -Wl,-bE:ruby.imp'
    
  •                       DLDFLAGS="${DLDFLAGS} -Wl,-G -Wl,-bnoentry -Wl,-bexpall"
    
  •                       LDFLAGS="${LDFLAGS} -Wl,-brtl -Wl,-bE:ruby.imp"
    

I don’t know about -bnoentry and -bexpall options, are they
preferable?

-#if defined(_AIX) && ! defined(_IA64)
-static void
-aix_loaderror(const char *pathname)

Do all AIX versions support dlopen()? If not, these probably
should not be removed but be changed the condition.

Hi,

Thank you very much for catching this thread.

  •                       DLDFLAGS='-Wl,-G -eInit_$(TARGET)'
    
  •                       LDFLAGS='-Wl,-brtl -Wl,-bE:ruby.imp'
    
  •                       DLDFLAGS="${DLDFLAGS} -Wl,-G -Wl,-bnoentry -Wl,-bexpall"
    
  •                       LDFLAGS="${LDFLAGS} -Wl,-brtl -Wl,-bE:ruby.imp"
    

I don’t know about -bnoentry and -bexpall options, are they
preferable?
To follow existing code which uses dlopen(), I omitted -e option.
Then, these options are used to supress some error message.

-#if defined(_AIX) && ! defined(_IA64)
-static void
-aix_loaderror(const char *pathname)

Do all AIX versions support dlopen()? If not, these probably
should not be removed but be changed the condition.
I have AIX 4.3.3 machine which is oldest in my test environment,
and it actually has dlopen(), but I think the older version AIX
would not have dlopen() (or broken?). I had prioritized the current
supported versions as matz said ( see [ruby-dev:29154]). I should
have been more carefully to support old versions.

Please give me some time to make another patch? I have noticed
the linker_flag variable you made. I will make new patch against
ruby_1_8 branch or trunk. Since I will test on various AIX versions,
it will take a little…

Thanks and best regards,

e$B$J$+$@$G$9!#e(B

e$B$a$s$I$/$5$$$N$Ge(Bdeve$B$K?6$j$^$9!#e(B

At Wed, 2 May 2007 20:18:19 +0900,
Yutaka K. wrote in [ruby-talk:249915]:

  •                       DLDFLAGS='-Wl,-G -eInit_$(TARGET)'
    
  •                       LDFLAGS='-Wl,-brtl -Wl,-bE:ruby.imp'
    
  •                       DLDFLAGS="${DLDFLAGS} -Wl,-G -Wl,-bnoentry -Wl,-bexpall"
    
  •                       LDFLAGS="${LDFLAGS} -Wl,-brtl -Wl,-bE:ruby.imp"
    

I don’t know about -bnoentry and -bexpall options, are they
preferable?
To follow existing code which uses dlopen(), I omitted -e option.
Then, these options are used to supress some error message.

e$B$D$^$j!"e(Bdlopen()/load()e$B$NABr$H$3$N%%W%7%g%s$OO"F0$7$F$$$k$H$$e(B
e$B$&G’<1$G$$$$$G$7$g$&$+!#e(B

have been more carefully to support old versions.
dlopen()e$B$,$"$l$P;H$&!"$H$$$&$3$H$J$ie(B(configure.ine$BE*$K$Oe(B)e$BOC$O4Je(B
e$BC1$G$$$$$s$G$9$,!"$?$V$s$=$&$OLd20$,27$5$J$$$s$G$7$g$&$M$’!#e(B

Please give me some time to make another patch? I have noticed
the linker_flag variable you made. I will make new patch against
ruby_1_8 branch or trunk. Since I will test on various AIX versions,
it will take a little…

e$B$b$A$m$sLdBj$"$j$^$;$s!#D4$Y$F$$$?$@$1$l$P$"$j$,$?$$$G$9!#e(B

e$B6bK$H$b$&$7$^$9!#e(B

e$B$a$s$I$/$5$$$N$Ge(Bdeve$B$K?6$j$^$9!#e(B
e$B$4G[N8DK$_F~$j$^$9!#e(B

e$B$D$^$j!"e(Bdlopen()/load()e$B$NABr$H$3$N%%W%7%g%s$OO"F0$7$F$$$k$H$$e(B
e$B$&G’<1$G$$$$$G$7$g$&$+!#e(B
e$B$O$$!"8=>u$G$O$=$&$$$&$3$H$K$J$j$^$9!#e(B

dlopen()e$B$,$"$l$P;H$&!"$H$$$&$3$H$J$ie(B(configure.ine$BE*$K$Oe(B)e$BOC$O4Je(B
e$BC1$G$$$$$s$G$9$,!"$?$V$s$=$&$OLd20$,27$5$J$$$s$G$7$g$&$M$’!#e(B
e$B$I$&$b!"e(Bdln.ce$B$N%3!<%I$r$_$k$K!"e(BAIXe$B$N8E$$%P!<%8%g%s$G$O$=$&$O27$7$F$b$i$($J$+$C$?e(B
e$B$H$$$&J70O5$$r46$8$^$7$?!#e(B

e$B$b$A$m$sLdBj$"$j$^$;$s!#D4$Y$F$$$?$@$1$l$P$"$j$,$?$$$G$9!#e(B
e$B$"$j$,$H$&$4$6$$$^$9!#e(B

e$B$H$3$m$G!"$R$H$D@h$K$4j$$$,$"$j$^$9!#e(B
e$B$D$$$G$_$?$$$GBgJQ?=$7Lu$J$$$N$G$9$,!"e(B
[ruby-dev:30504]e$B$G0JA0Js9p$5$;$F$$$?$@$$$?!“e(B
1.9e$B$G$N$H$”$kJQ?tL>$H4X?tL>$,e(BAIXe$B$K8GM-$N$b$N$H$+$V$C$F$7$^$C$F$$$k7o$Ke(B
e$B$D$$$F$NBP1~$r$
$M$,$$$G$-$^$;$s$G$7$g$&$+e(B?
e$B6qBNE*$K$Oe(Bnum_te$B$He(Bthread_init()e$B$N$U$?$D$K$J$j$^$9!#e(B
e$BL>A0$rJQ$($k$0$i$$$7$+;W$$$D$+$J$$$N$G$9$,!"e(B
e$B$b$7?7$7$$L>A0$r$$$?$@$1$l$P$3$A$i$G%Q%C%A$r:n$i$;$FD:$-$^$9!#e(B
e$B$H$$$C$F$b$d$l$k$3$H$O!“Nc$($Pe(B
% ruby -pi.bak -e ‘$.gsub!(/\bnum_t\b/,%q!rb_num_t!)’ vm_evalbody.ci
insns.def vm.c tool/insns2vm.rb
% ruby -pi.bak -e '$
.gsub!(/\bthread_init\b/,%q!rb_thread_init!)’
yarvcore.c
e$B$@$1$J$N$G$9$,!#!#!#e(B
e$B$3$l$G$H$j$”$($:<j85$G$O!“e(B
% ruby -v
ruby 1.9.0 (2007-05-02 patchlevel 0) [powerpc-aix5.3.0.0]
e$B$H$G$-$”$,$j$^$9!#e(B

e$B$h$m$7$/$*4j$$$$$?$7$^$9!#e(B

金本ともうします。

大分時間がたってしまって恐縮なのですが、
以前、AIXの64ビットモードでのコンパイルについて、
拾っていただいた件について調査しました。

07/05/02 に Nobuyoshi N.[email protected] さんは書きました:
(中略)

Please give me some time to make another patch? I have noticed
the linker_flag variable you made. I will make new patch against
ruby_1_8 branch or trunk. Since I will test on various AIX versions,
it will take a little…

もちろん問題ありません。調べていただければありがたいです。
結局のところ、私が以前送らせていただいたconfigure.inへの
ãƒ‘ãƒƒãƒã§ãƒªãƒ³ã‚«ã‚’ç›´æŽ¥å‘¼ã¶ã‚ˆã†ã«ã—ãŸã¨ãã®ãƒãƒ§ãƒ³ãƒœãŒåŽŸå› ã§ã—ãŸã€‚
大変申し訳ありません。
#32ビットモードなら問題ないです。あとAIX5.2では起きませんでした。

とりあえず、1.8と1.9両方のパッチを添付します。

また、1.9の方はjsonライブラリのgenerator.cのstring.hの位置がAIXで
ä¸éƒ½åˆãŒã‚ã£ãŸã®ã§é †ç•ªã‚’å¤‰ãˆãŸã®ã¨ã€.cのファイルでc++スタイルの
コメントが使えるようにCFLAGSに-qcpluscmtã¨ã„ã†ã®ã‚’åŠ ãˆã¦ã‚ã‚Šã¾ã™ã€‚

大元の問題であった拡張ライブラリが呼べないのが解決できています。
% ruby -v -retc -e ‘p $:, 0xffffffff.class’
ruby 1.9.0 (2007-08-13 patchlevel 0) [powerpc-aix5.3.0.0]
[“/home/kanemoto/r19xlc64/lib/ruby/site_ruby/1.9”,
“/home/kanemoto/r19xlc64/lib/ruby/site_ruby/1.9/powerpc-aix5.3.0.0”,
“/home/kanemoto/r19xlc64/lib/ruby/site_ruby”,
“/home/kanemoto/r19xlc64/lib/ruby/1.9”,
“/home/kanemoto/r19xlc64/lib/ruby/1.9/powerpc-aix5.3.0.0”, “.”]
Fixnum
(64ビットなので0xffffffffがFixnumということで。。。)

あと、AIXで–enable-sharedをデフォルトにしてみたのですが、
何かstaticにしたほうがいい理由などはありますでしょうか?

このpatchで対応できるのは、結局環境変数でOBJECT_MODE=64というのが
設定されていてIBM XL C Compilerを使っていたときだけで、
gccには対応できません。gccはOBJECT_MODEなんぞ知らないのに、
中で呼ばれるOS付属のリンカが64ビットで動いてしまいます。

また、以前

環境変数 OBJECT_MODE=64 で一切合財設定不要になるようなのですが、
rbconfig.rb に痕跡が残らないと後々 extconf.rb するときにハマリそうに思います。
という要望があったのが気になっていたので、両方を解決できるように
ためしに–enable-aix64なるオプションを作ったりしてみたのですが、
gcc に -maix32を渡しても、アセンブラに-a32を渡してくれないので、
OBJECT_MODE=64ãŒè¨­å®šã•ã‚Œã¦ã„ã‚‹å ´åˆã«å¯¾å¿œã§ãã¾ã›ã‚“ã€‚
仮に-Wa,-a32とオプションをつけても、asに-a32を渡してくれませんでした。

ぐだぐだかいてすみません。
これはこれで何かうまい手が思いついたら別件として投稿させていただきます。

よろしくお願いいたします。

e$B$J$+$@$G$9!#e(B

At Tue, 14 Aug 2007 03:01:39 +0900,
Yutaka K. wrote in [ruby-dev:31401]:

e$B$H$j$"$($:!"e(B1.8e$B$He(B1.9e$BN>J}$N%Q%C%A$rE:IU$7$^$9!#e(B

  • gcce$B0J30$O!"e(BLDSHAREDe$B$Oe(Blde$B$G$O$J$/e(B$(CC)
  • -Ge$B$re(B*LDFLAGSe$B$+$ie(BLDSHAREDe$B$K0$9e(B
  • -brtle$B$re(BXLDFLAGSe$B$@$1$K$9$ke(B
    e$B$H$$$&$3$H$G$$$$$s$G$7$g$&$+!#e(B

e$B$^$?!“e(B1.9e$B$NJ}$Oe(Bjsone$B%i%$%V%i%j$Ne(Bgenerator.ce$B$Ne(Bstring.he$B$N0LCV$,e(BAIXe$B$Ge(B
e$BITET9g$,$”$C$?$N$G=gHV$rJQ$($?$N$H!“e(B.ce$B$N%U%!%$%k$Ge(Bc++e$B%9%?%$%k$Ne(B
e$B%3%a%s%H$,;H$($k$h$&$Ke(BCFLAGSe$B$Ke(B-qcpluscmte$B$H$$$&$N$r2C$($F$”$j$^$9!#e(B

e$B$3$l$O5U$K$=$&$$$&%3%a%s%H$r>C$9$[$&$,K>$^$7$$$s$G$9$,!“e(Bvm.ce$B0J30e(B
e$B$K$b$”$j$^$9$+!#$H$$$&$+!"0lEYA4It>C$7$?$H;W$&$s$G$9$,!#e(B

e$B$"$H!"e(BAIXe$B$Ge(B–enable-sharede$B$r%G%U%)%k%H$K$7$F$_$?$N$G$9$,!“e(B
e$B2?$+e(Bstatice$B$K$7$?$[$&$,$$$$M}M3$J$I$O$”$j$^$9$G$7$g$&$+e(B?

e$B$=$N$X$s$Oe(BOSe$B$NET9g$H$+%a%s%F%J$NJ}?K$H$+$G$7$g$&$M!#$`$7$m%G%U%)e(B
e$B%k%H$Ge(B–enable-sharede$B$K$7$?$[$&$,$$$$$+$b!#e(B

gcc e$B$Ke(B -maix32e$B$rEO$7$F$b!"%"%;%s%V%i$Ke(B-a32e$B$rEO$7$F$/$l$J$$$N$G!"e(B
OBJECT_MODE=64e$B$,@_Dj$5$l$F$$$k>l9g$KBP1~$G$-$^$;$s!#e(B
e$B2>$Ke(B-Wa,-a32e$B$H%*%W%7%g%s$r$D$1$F$b!"e(Base$B$Ke(B-a32e$B$rEO$7$F$/$l$^$;$s$G$7$?!#e(B

gcce$BB&$GBP1~$7$F$b$i$o$J$$8B$j!"$J$s$H$b$J$i$J$$$+$b$7$l$^$;$s$M!#e(B

Index: configure.in

— configure.in (revision 12928)
+++ configure.in (working copy)
@@ -1043,9 +1043,9 @@ if test “$with_dln_a_out” != yes; then
: ${LDSHARED=’$(CC) -shared’}
else

  •      : ${LDSHARED='/usr/ccs/bin/ld'}
    
  •      : ${LDSHARED='$(CC)'}
     fi
    
  •  DLDFLAGS="${linker_flag}-G"' -eInit_$(TARGET)'
    
  •  LDFLAGS="${LDFLAGS} ${linker_flag}-brtl"
    
  •  XLDFLAGS="${linker_flag}-bE:ruby.imp"
    
  •  LDSHARED="$LDSHARED ${linker_flag}-G"
    
  •  DLDFLAGS='-eInit_$(TARGET)'
    
  •  XLDFLAGS="${linker_flag}-bE:ruby.imp ${linker_flag}-brtl"
     : ${ARCHFILE="ruby.imp"}
                       TRY_LINK='$(CC) $(LDFLAGS) -oconftest 
    

$(INCFLAGS) -I$(hdrdir) $(CPPFLAGS)’
@@ -1360,5 +1360,5 @@ if test “$enable_shared” = ‘yes’; then
;;
aix*)

  • LIBRUBY_DLDFLAGS="${linker_flag}-G ${linker_flag}-bnoentry $XLDFLAGS"
  • LIBRUBY_DLDFLAGS="${linker_flag}-bnoentry $XLDFLAGS"
    LIBRUBYARG_SHARED=’-L${libdir} -l${RUBY_SO_NAME}’
    SOLIBS=’-lm -lc’
    Index: vm.c
    ===================================================================
    — vm.c (revision 12928)
    +++ vm.c (working copy)
    @@ -238,9 +238,11 @@ vm_make_env_each(rb_thread_t *th, rb_con
    for (i = 0; i <= local_size; i++) {
    env->env[i] = envptr[-local_size + i];
  • // dp(env->env[i]);
    +#if 0
  • dp(env->env[i]);
    if (RUBY_VM_NORMAL_ISEQ_P(cfp->iseq)) {
    /* clear value stack for GC */
  •  // envptr[-local_size + i] = 0;
    
  •  envptr[-local_size + i] = 0;
    
    }
    +#endif
    }

e$B6bK$H$b$&$7$^$9!#e(B

e$BJVEz$,CY$/$J$C$F?=$7Lu$"$j$^$;$s!#e(B

07/08/14 e$B$Ke(B Nobuyoshi N.[email protected]
e$B$5$s$O=q$-$^$7$?e(B:

  • gcce$B0J30$O!"e(BLDSHAREDe$B$Oe(Blde$B$G$O$J$/e(B$(CC)
  • -Ge$B$re(B*LDFLAGSe$B$+$ie(BLDSHAREDe$B$K0$9e(B
  • -brtle$B$re(BXLDFLAGSe$B$@$1$K$9$ke(B
    e$B$H$$$&$3$H$G$$$$$s$G$7$g$&$+!#e(B
    e$B$O$$!#e(B
    e$B$9$G$K%^!<%8$5$l$?%3!<%I$G!";d$N4D6-$GF0:n$9$k$3$H$r3NG’$7$^$7$?!#e(B

e$B$3$l$O5U$K$=$&$$$&%3%a%s%H$r>C$9$[$&$,K>$^$7$$$s$G$9$,!“e(Bvm.ce$B0J30e(B
e$B$K$b$”$j$^$9$+!#$H$$$&$+!“0lEYA4It>C$7$?$H;W$&$s$G$9$,!#e(B
e$B8=:_$OB>$K$O$”$j$^$;$s$G$7$?!#e(B

e$B$=$N$X$s$Oe(BOSe$B$NET9g$H$+%a%s%F%J$NJ}?K$H$+$G$7$g$&$M!#$`$7$m%G%U%)e(B
e$B%k%H$Ge(B–enable-sharede$B$K$7$?$[$&$,$$$$$+$b!#e(B
e$B8D?ME*$K$O;?@.$G$9!#e(B
e$B$H$3$m$G!"e(B
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=13062
e$B$K$Oe(B

  • configure.in (aix): enable shared by default.
    e$B$H$“$C$?$N$G$9$,!”%3!<%I$KJQ99$,$J$+$C$?$h$&$G$9!#e(B
    e$B:#8e%G%U%)%k%H$Ge(B–enable-sharede$B$K$J$k$N$G$"$l$P!“e(B
    #e$B$”$k$$$O5Q2<$G$be(B
    e$B$<$s$<$s$+$^$o$J$$$N$G$9$,!"0l1~5$$E$$$?$N$GG0$N$?$aJs9p$7$^$9!#e(B

gcce$BB&$GBP1~$7$F$b$i$o$J$$8B$j!"$J$s$H$b$J$i$J$$$+$b$7$l$^$;$s$M!#e(B
e$B$O$$!#e(B
e$B$?$@!"e(BOBJECT_MODE=64e$B$H<+J,$G@Dj$7$F$*$$$Fe(B32bite$B$N%P%$%J%j$r:n$j$?$$!"e(B
e$B$H$$$&$^$l$JMW5a$N$H$-$KLdBj$,5/$-$k$@$1$J$N$G!"e(B
e$B$3$N%Q%?!<%s$J$H$-$Ke(Bconfiguree$B$r;
$a$F%(%i!<$r=P$9$H$$$&$3$H$K$7$F!“e(B
gcce$B$Ge(B64bite$B$NBP1~$r$9$k$H$$$&<j$b$”$k5$$,$7$F$-$^$7$?!#e(B

e$B$3$l$,$G$-$F$&$l$7$$?M$,;d$NB>$K$$$k$+$I$&$+HyL/$G$9$,!"e(B
e$B$A$g$C$HLO:w$7$F$_$^$9!#e(B