On Fri, Feb 16, 2001 at 05:44:34PM +0100, [EMAIL PROTECTED] wrote:
> On Fri, 16 Feb 2001 [EMAIL PROTECTED] wrote:
> 
> > Hi Jarkko,
> >
> > > > I'll try to do one or two more builds. I'd really like to try it with
> > > > Apache's mod_perl and mod_embed, these really didn't work at all with
> > > > perl-5.6.0, but I'm not sure I'll find the time.
> 
> [AIX-4.3.2, IBM's C compiler, Apache apxs shared modules]
> 
> I tried to get mod_perl-1.25 (an Apache/perl module that's
> supposed to let you use perl to implement script-based apache modules)
> working with perl-5.6.1-trial2, and failed. I can get mod_perl
> working with perl-5.5.3, but I never succeeded with perl-5.6.0.
> 
> With perl-5.6.1-trial2, the mod-perl initialisation is successful, but I
> get a segmentation fault as soon as I try to access the perl script
> (test.pl or test.perl).

A short while ago the Apache distribution did change over to the native
dlopen library if the AIX version 4.3 and above. For previous versions
the dlopen emulation layer is still used. Perl does always use the
emulation, which produces a conflict if Apache uses the native one in
the modperl case. I attach a patch below that changes the perl
distribution to also use the native AIX dlopen on AIX 4.3 and above as
in the Apache case.

For getting some more involved modperl modules like Embperl to work we
probably need to change the modperl.exp file to include the magic "#! ."
instead of simply "#!" at the beginning, this signals the native dlopen
to import symbols from the main program. The patch already does that in
makedef.pl for the perl.exp file, but only on AIX 4.3 and above because
the older AIX linkers do strange things if this option is used.

-- 
Jens-Uwe Mager

HELIOS Software GmbH
Steinriede 3
30827 Garbsen
Germany

Phone:          +49 5131 709320
FAX:            +49 5131 709325
Internet:       [EMAIL PROTECTED]
--- perl-5.6.1-TRIAL2/ext/DynaLoader/dl_aix.xs.orig     Wed Feb 21 19:45:18 2001
+++ perl-5.6.1-TRIAL2/ext/DynaLoader/dl_aix.xs  Wed Feb 21 21:16:53 2001
@@ -14,6 +14,21 @@
 #define PERLIO_NOT_STDIO 0
 
 /*
+ * On AIX 4.3 and above the emulation layer is not needed any more, and
+ * indeed if perl uses its emulation and perl is linked into apache
+ * which is supposed to use the native dlopen conflicts arise.
+ * Jens-Uwe Mager [EMAIL PROTECTED]
+ */
+#ifdef USE_NATIVE_DLOPEN
+
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+#include <dlfcn.h>
+
+#else
+
+/*
  * @(#)dlfcn.c 1.5 revision of 93/02/14  20:14:17
  * This is an unpublished work copyright (c) 1992 Helios Software GmbH
  * 3000 Hannover 1, Germany
@@ -89,6 +104,13 @@
 # define FREAD(p,s,n,ldptr)    fread(p,s,n,IOPTR(ldptr))
 #endif
 
+#ifndef RTLD_LAZY
+# define RTLD_LAZY 0
+#endif
+#ifndef RTLD_GLOBAL
+# define RTLD_GLOBAL 0
+#endif
+
 /*
  * We simulate dlopen() et al. through a call to load. Because AIX has
  * no call to find an exported symbol we read the loader section of the
@@ -627,6 +649,7 @@
        safefree(buf);
        return ret;
 }
+#endif /* USE_NATIVE_DLOPEN */
 
 /* dl_dlopen.xs
  * 
@@ -672,7 +695,7 @@
        DLDEBUG(1,PerlIO_printf(Perl_debug_log, "dl_load_file(%s,%x):\n", 
filename,flags));
        if (flags & 0x01)
            Perl_warn(aTHX_ "Can't make loaded symbols global on this platform while 
loading %s",filename);
-       RETVAL = dlopen(filename, 1) ;
+       RETVAL = dlopen(filename, RTLD_GLOBAL|RTLD_LAZY) ;
        DLDEBUG(2,PerlIO_printf(Perl_debug_log, " libref=%x\n", RETVAL));
        ST(0) = sv_newmortal() ;
        if (RETVAL == NULL)
--- perl-5.6.1-TRIAL2/hints/aix.sh.orig Wed Feb 21 19:39:30 2001
+++ perl-5.6.1-TRIAL2/hints/aix.sh      Wed Feb 21 19:45:00 2001
@@ -55,9 +55,11 @@
 case "$osvers" in
    3.*|4.1.*|4.2.*)
       usenm='undef'
+      usenativedlopen='false'
       ;;
    *)
       usenm='true'
+      usenativedlopen='true'
       ;;
 esac
 
@@ -405,20 +407,25 @@
 esac
 EOCBU
 
-# If the C++ libraries, libC and libC_r, are available we will prefer them
-# over the vanilla libc, because the libC contain loadAndInit() and
-# terminateAndUnload() which work correctly with C++ statics while libc
-# load() and unload() do not.  See ext/DynaLoader/dl_aix.xs.
-# The C-to-C_r switch is done by usethreads.cbu, if needed.
-if test -f /lib/libC.a -a X"`$cc -v 2>&1 | grep gcc`" = X; then
-    # Cify libswanted.
-    set `echo X "$libswanted "| sed -e 's/ c / C c /'`
-    shift
-    libswanted="$*"
-    # Cify lddlflags.
-    set `echo X "$lddlflags "| sed -e 's/ -lc / -lC -lc /'`
-    shift
-    lddlflags="$*"
+if test $usenativedlopen = 'true'
+then
+        ccflags="$ccflags -DUSE_NATIVE_DLOPEN"
+else
+    # If the C++ libraries, libC and libC_r, are available we will prefer them
+    # over the vanilla libc, because the libC contain loadAndInit() and
+    # terminateAndUnload() which work correctly with C++ statics while libc
+    # load() and unload() do not.  See ext/DynaLoader/dl_aix.xs.
+    # The C-to-C_r switch is done by usethreads.cbu, if needed.
+    if test -f /lib/libC.a -a X"`$cc -v 2>&1 | grep gcc`" = X; then
+       # Cify libswanted.
+       set `echo X "$libswanted "| sed -e 's/ c / C c /'`
+       shift
+       libswanted="$*"
+       # Cify lddlflags.
+       set `echo X "$lddlflags "| sed -e 's/ -lc / -lC -lc /'`
+       shift
+       lddlflags="$*"
+    fi
 fi
 
 # EOF
--- perl-5.6.1-TRIAL2/makedef.pl.orig   Wed Feb 21 19:06:38 2001
+++ perl-5.6.1-TRIAL2/makedef.pl        Wed Feb 21 19:06:42 2001
@@ -165,7 +165,15 @@
 ---EOP---
 }
 elsif ($PLATFORM eq 'aix') {
-    print "#!\n";
+    $OSVER = `uname -v`;
+    chop $OSVER;
+    $OSREL = `uname -r`;
+    chop $OSREL;
+    if ($OSVER > 4 || ($OSVER == 4 && $OSREL >= 3)) {
+       print "#! .\n";
+    } else {
+       print "#!\n";
+    }
 }
 
 my %skip;

Reply via email to