diff options
-rw-r--r-- | ext/DynaLoader/dl_aix.xs | 41 | ||||
-rw-r--r-- | ext/File/Glob/Makefile.PL | 10 | ||||
-rw-r--r-- | hints/aix.sh | 131 | ||||
-rwxr-xr-x | t/lib/ipc_sysv.t | 19 |
4 files changed, 187 insertions, 14 deletions
diff --git a/ext/DynaLoader/dl_aix.xs b/ext/DynaLoader/dl_aix.xs index f845681ae1..0a92af7ca6 100644 --- a/ext/DynaLoader/dl_aix.xs +++ b/ext/DynaLoader/dl_aix.xs @@ -20,6 +20,15 @@ #include "perl.h" #include "XSUB.h" +/* When building as a 64-bit binary on AIX, define this to get the + * correct structure definitions. Also determines the field-name + * macros and gates some logic in readEntries(). -- Steven N. Hirsch + * <hirschs@btv.ibm.com> */ +#ifdef USE_64_BIT_ALL +# define __XCOFF64__ +# define __XCOFF32__ +#endif + #include <stdio.h> #include <errno.h> #include <string.h> @@ -29,6 +38,18 @@ #include <a.out.h> #include <ldfcn.h> +#ifdef USE_64_BIT_ALL +# define AIX_SCNHDR SCNHDR_64 +# define AIX_LDHDR LDHDR_64 +# define AIX_LDSYM LDSYM_64 +# define AIX_LDHDRSZ LDHDRSZ_64 +#else +# define AIX_SCNHDR SCNHDR +# define AIX_LDHDR LDHDR +# define AIX_LDSYM LDSYM +# define AIX_LDHDRSZ LDHDRSZ +#endif + /* When using Perl extensions written in C++ the longer versions * of load() and unload() from libC and libC_r need to be used, * otherwise statics in the extensions won't get initialized right. @@ -394,10 +415,10 @@ static int readExports(ModulePtr mp) { dTHX; LDFILE *ldp = NULL; - SCNHDR sh; - LDHDR *lhp; + AIX_SCNHDR sh; + AIX_LDHDR *lhp; char *ldbuf; - LDSYM *ls; + AIX_LDSYM *ls; int i; ExportPtr ep; @@ -463,7 +484,11 @@ static int readExports(ModulePtr mp) return -1; } } +#ifdef USE_64_BIT_ALL + if (TYPE(ldp) != U803XTOCMAGIC) { +#else if (TYPE(ldp) != U802TOCMAGIC) { +#endif errvalid++; strcpy(errbuf, "readExports: bad magic"); while(ldclose(ldp) == FAILURE) @@ -511,8 +536,8 @@ static int readExports(ModulePtr mp) ; return -1; } - lhp = (LDHDR *)ldbuf; - ls = (LDSYM *)(ldbuf+LDHDRSZ); + lhp = (AIX_LDHDR *)ldbuf; + ls = (AIX_LDSYM *)(ldbuf+AIX_LDHDRSZ); /* * Count the number of exports to include in our export table. */ @@ -536,15 +561,19 @@ static int readExports(ModulePtr mp) * the entry point we got from load. */ ep = mp->exports; - ls = (LDSYM *)(ldbuf+LDHDRSZ); + ls = (AIX_LDSYM *)(ldbuf+AIX_LDHDRSZ); for (i = lhp->l_nsyms; i; i--, ls++) { char *symname; if (!LDR_EXPORT(*ls)) continue; +#ifndef USE_64_BIT_ALL if (ls->l_zeroes == 0) +#endif symname = ls->l_offset+lhp->l_stoff+ldbuf; +#ifndef USE_64_BIT_ALL else symname = ls->l_name; +#endif ep->name = savepv(symname); ep->addr = (void *)((unsigned long)mp->entry + ls->l_value); ep++; diff --git a/ext/File/Glob/Makefile.PL b/ext/File/Glob/Makefile.PL index c82988fdb1..98781c98e7 100644 --- a/ext/File/Glob/Makefile.PL +++ b/ext/File/Glob/Makefile.PL @@ -9,3 +9,13 @@ WriteMakefile( # DEFINE => '-DGLOB_DEBUG', # OPTIMIZE => '-g', ); +use Config; +sub MY::cflags { + package MY; + my $inherited = shift->SUPER::cflags(@_); + if ($Config::Config{archname} =~ /^aix/ and + $Config::Config{use64bitall} eq 'define') { + $inherited =~ s/\s-O\d?//m; + } + $inherited; +} diff --git a/hints/aix.sh b/hints/aix.sh index 1029a36aea..6e8a4b3c1c 100644 --- a/hints/aix.sh +++ b/hints/aix.sh @@ -3,6 +3,7 @@ # AIX 4.1 hints thanks to Christopher Chan-Nui <channui@austin.ibm.com>. # AIX 4.1 pthreading by Christopher Chan-Nui <channui@austin.ibm.com> and # Jarkko Hietaniemi <jhi@iki.fi>. +# AIX 4.3.x LP64 build by Steven Hirsch <hirschs@btv.ibm.com> # Merged on Mon Feb 6 10:22:35 EST 1995 by # Andy Dougherty <doughera@lafcol.lafayette.edu> @@ -67,6 +68,31 @@ so="a" # Stephanie Beals <bealzy@us.ibm.com> dlext="so" +# Take possible hint from the environment. If 32-bit is set in the +# environment, we can override it later. If set for 64, the +# 'sizeof' test sees a native 64-bit architecture and never looks back. +case "$OBJECT_MODE" in +32) + cat >&4 <<EOF + +You have OBJECT_MODE=32 set in the environment. +I take this as a hint you do not want to +build for a 64-bit address space. You will be +given the opportunity to change this later. +EOF + ;; +64) + cat >&4 <<EOF + +You have OBJECT_MODE=64 set in the environment. +This forces a full 64-bit build. If that is +not what you intended, please terminate this +program, unset it and restart. +EOF + ;; +*) ;; +esac + # Trying to set this breaks the POSIX.c compilation # Make setsockopt work correctly. See man page. @@ -197,7 +223,7 @@ case "$uselargefiles" in case "$lfcflags$lfldflags$lflibs" in '');; *) ccflags="$ccflags $lfcflags" - ldflags="$ldflags $ldldflags" + ldflags="$ldflags $lfldflags" libswanted="$libswanted $lflibs" ;; esac @@ -217,13 +243,110 @@ $define|true|[yY]*) 3.*|4.[012].*) cat >&4 <<EOM AIX `oslevel` does not support 64-bit interfaces. -You should upgrade to at least AIX 4.2. +You should upgrade to at least AIX 4.3. EOM exit 1 ;; esac - # When a 64-bit cc becomes available $archname64 - # may need setting so that $archname gets it attached. + ;; +esac +EOCBU + +# This script UU/use64bitall.cbu will get 'called-back' by Configure +# after it has prompted the user for whether to use full 64-bitness. +cat > UU/use64bitall.cbu <<'EOCBU' +case "$use64bitall" in +$define|true|[yY]*) + case "`oslevel`" in + 3.*|4.[012].*) + cat >&4 <<EOM +AIX `oslevel` does not support 64-bit interfaces. +You should upgrade to at least AIX 4.3. +EOM + exit 1 + ;; + esac + echo " " + echo "Checking the CPU width of your hardware..." >&4 + $cat >size.c <<EOCP +#include <stdio.h> +#include <sys/systemcfg.h> +int main (void) +{ + printf("%d\n",_system_configuration.width); + return(0); +} +EOCP + set size + if eval $compile_ok; then + lfcpuwidth=`./size` + echo "You are running on $lfcpuwidth bit hardware." + else + dflt="32" + echo " " + echo "(I can't seem to compile the test program. Guessing...)" + rp="What is the width of your CPU (in bits)?" + . ./myread + lfcpuwidth="$ans" + fi + $rm -f size.c size + case "$lfcpuwidth" in + 32*) + cat >&4 <<EOM +Bzzzt! At present, you can only perform a +full 64-bit build on a 64-bit machine. +EOM + exit 1 + ;; + esac + lfcflags="`getconf XBS5_LP64_OFF64_CFLAGS 2>/dev/null`" + lfldflags="`getconf XBS5_LP64_OFF64_LDFLAGS 2>/dev/null`" + # See jhi's comments above regarding this re-eval. I've + # seen similar weirdness in the form of: + # +# 1506-173 (W) Option lm is not valid. Enter xlc for list of valid options. + # + # error messages from 'cc -E' invocation. Again, the offending + # string is simply not detectable by any means. Since it doesn't + # do any harm, I didn't pursue it. -- sh + lfldflags="`echo $lfldflags`" + lflibs="`getconf XBS5_LP64_OFF64_LIBS 2>/dev/null|sed -e 's@^-l@@' -e 's@ -l@ @g`" + # -q32 and -b32 may have been set by uselfs or user. Remove them. + ccflags="`echo $ccflags | sed -e 's@-q32@@'`" + ldflags="`echo $ldflags | sed -e 's@-b32@@'`" + # Tell archiver to use large format. Unless we remove 'ar' + # from 'trylist', the Configure script will just reset it to 'ar' + # immediately prior to writing config.sh. This took me hours + # to figure out. + trylist="`echo $trylist | sed -e 's@^ar @@' -e 's@ ar @@g' -e 's@ ar$@@'`" + ar="ar -X64" + nm_opt="-X64 $nm_opt" + # Note: Placing the 'lfcflags' variable into the 'ldflags' string + # is NOT a typo. ldlflags is passed to the C compiler for final + # linking, and it wants -q64 (-b64 is for ld only!). + case "$lfcflags$lfldflags$lflibs" in + '');; + *) ccflags="$ccflags $lfcflags" + ldflags="$ldflags $lfcflags" + lddlflags="$lfldflags $lddlflags" + libswanted="$libswanted $lflibs" + ;; + esac + case "$ccflags" in + *-DUSE_64_BIT_ALL*) ;; + *) ccflags="$ccflags -DUSE_64_BIT_ALL";; + esac + case "$archname64" in + ''|64*) archname64=64all ;; + esac + longsize="8" + # Don't try backwards compatibility + bincompat="$undef" + d_bincompat5005="$undef" + lfcflags='' + lfldflags='' + lflibs='' + lfcpuwidth='' ;; esac EOCBU diff --git a/t/lib/ipc_sysv.t b/t/lib/ipc_sysv.t index 9777292f37..55d9ba197f 100755 --- a/t/lib/ipc_sysv.t +++ b/t/lib/ipc_sysv.t @@ -81,9 +81,16 @@ if ($Config{'d_msgget'} eq 'define' && my $test5bad; my $test6bad; - unless (msgsnd($msg,pack("L a*",$msgtype,$msgtext),IPC_NOWAIT)) { + if ($Config{'use64bitall'} eq 'define') { + unless (msgsnd($msg,pack("L L a*",0,$msgtype,$msgtext),IPC_NOWAIT)) { print "not "; - $test2bad = 1; + $test2bad = 1; + } + } else { + unless (msgsnd($msg,pack("L a*",$msgtype,$msgtext),IPC_NOWAIT)) { + print "not "; + $test2bad = 1; + } } print "ok 2\n"; if ($test2bad) { @@ -127,8 +134,12 @@ EOM EOM } - my($rmsgtype,$rmsgtext) = unpack("L a*",$msgbuf); - + my($rmsgtype,$rmsgtext); + if ($Config{'use64bitall'} eq 'define') { + (undef,$rmsgtype,$rmsgtext) = unpack("L L a*",$msgbuf) + } else { + ($rmsgtype,$rmsgtext) = unpack("L a*",$msgbuf) + } unless($rmsgtype == $msgtype && $rmsgtext eq $msgtext) { print "not "; $test6bad = 1; |