[PATCH 1/3] AIX: use proper ABI flags in search for toolchain

Michael Haubenwallner <[email protected]>
Newsgroups gmane.comp.gnu.libtool.patches
Message-ID <1458579711-19903-2-git-send-email-michael.haubenwallner@ssi-schaefer.com>
The native PowerPC AIX toolchain does accept only 32 bit objects by
default.  They either need the -X32_64 flag to accept both, or the
OBJECT_MODE=64 environment variable to accept 64 bit only.  We rely on
the new gl_POWERPC_AIX_OBJECT_MODE early gnulib macro setting the
gl_cv_powerpc_aix_object_mode configure variable, and then use the
proper abi flags to search for the PowerPC AIX tools, to ensure they
actually work with the object file format the compiler generates.
* gnulib: Bump, for the gl_POWERPC_AIX_OBJECT_MODE macro.
* m4/libtool.m4 (LT_INIT): Require gl_POWERPC_AIX_OBJECT_MODE.
(_LT_PROG_AR): When gl_cv_powerpc_aix_object_mode != no, use the -X32_64
flag to search for the ar tool.
(_LT_CMD_OLD_ARCHIVE): Ditto for strip, ranlib.
(LT_PATH_NM): Ditto for nm.
(LT_PATH_LD): When gl_cv_powerpc_aix_object_mode != no, use the -b32
or -b64 flag to search for the ld program.
(_LT_LINKER_SHLIBS): Instead of testing the shared_archive_member_spec
value, use gl_cv_powerpc_aix_object_mode directly.
* m4/ltoptions.m4 (_LT_WITH_AIX_SONAME): Instead of testing the
OBJECT_MODE environment variable, use gl_cv_powerpc_aix_object_mode to
define the shared_archive_member_spec value.
---
 gnulib          |  2 +-
 m4/libtool.m4   | 38 +++++++++++++++++++++++++++++++-------
 m4/ltoptions.m4 |  4 +---
 3 files changed, 33 insertions(+), 11 deletions(-)

diff --git a/gnulib b/gnulib
index 5be7728..2575bf3 160000
--- a/gnulib
+++ b/gnulib
@@ -1 +1 @@
-Subproject commit 5be7728cf7c0fb61be1ccbfbd302764ef7e6b72d
+Subproject commit 2575bf3fae3c42e4f90b95437a7692f52e0bf99d
diff --git a/m4/libtool.m4 b/m4/libtool.m4
index ee292af..513e2ae 100644
--- a/m4/libtool.m4
+++ b/m4/libtool.m4
@@ -61,6 +61,7 @@ esac
 AC_DEFUN([LT_INIT],
 [AC_PREREQ([2.62])dnl We use AC_PATH_PROGS_FEATURE_CHECK
 AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
+AC_REQUIRE([gl_POWERPC_AIX_OBJECT_MODE])dnl
 AC_BEFORE([$0], [LT_LANG])dnl
 AC_BEFORE([$0], [LT_OUTPUT])dnl
 AC_BEFORE([$0], [LTDL_INIT])dnl
@@ -1491,7 +1492,11 @@ need_locks=$enable_libtool_lock
 # _LT_PROG_AR
 # -----------
 m4_defun([_LT_PROG_AR],
-[AC_CHECK_TOOLS(AR, [ar], false)
+[if test no != "$gl_cv_powerpc_aix_object_mode"; then
+  AC_CHECK_TOOLS(AR, ["ar -X32_64"], false)
+else
+  AC_CHECK_TOOLS(AR, [ar], false)
+fi
 : ${AR=ar}
 _LT_DECL([], [AR], [1], [The archiver])
 
@@ -1543,11 +1548,19 @@ _LT_DECL([], [archiver_list_spec], [1],
 m4_defun([_LT_CMD_OLD_ARCHIVE],
 [_LT_PROG_AR
 
-AC_CHECK_TOOL(STRIP, strip, :)
+if test no != "$gl_cv_powerpc_aix_object_mode"; then
+  AC_CHECK_TOOL(STRIP, strip -X32_64, :)
+else
+  AC_CHECK_TOOL(STRIP, strip, :)
+fi
 test -z "$STRIP" && STRIP=:
 _LT_DECL([], [STRIP], [1], [A symbol stripping program])
 
-AC_CHECK_TOOL(RANLIB, ranlib, :)
+if test no != "$gl_cv_powerpc_aix_object_mode"; then
+  AC_CHECK_TOOL(RANLIB, ranlib -X32_64, :)
+else
+  AC_CHECK_TOOL(RANLIB, ranlib, :)
+fi
 test -z "$RANLIB" && RANLIB=:
 _LT_DECL([], [RANLIB], [1],
     [Commands used to install an old-style archive])
@@ -3293,6 +3306,9 @@ if test yes = "$GCC"; then
       while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
 	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
       done
+      if test no != "$gl_cv_powerpc_aix_object_mode"; then
+	ac_prog="$ac_prog -b$gl_cv_powerpc_aix_object_mode"
+      fi
       test -z "$LD" && LD=$ac_prog
       ;;
   "")
@@ -3331,6 +3347,9 @@ AC_CACHE_VAL(lt_cv_path_LD,
     fi
   done
   IFS=$lt_save_ifs
+  if test no != "$gl_cv_powerpc_aix_object_mode"; then
+    lt_cv_path_LD="$lt_cv_path_LD -b$gl_cv_powerpc_aix_object_mode"
+  fi
 else
   lt_cv_path_LD=$LD # Let the user override the test with a path.
 fi])
@@ -3701,13 +3720,18 @@ else
 	#   nm: unknown option "B" ignored
 	# Tru64's nm complains that /dev/null is an invalid object file
 	# MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty
+	# AIX nm needs -X32_64 to accept both 32 and 64 bit objects
+	tmp_nmflags=-B
+	if test no != "$gl_cv_powerpc_aix_object_mode"; then
+	  tmp_nmflags='-X32_64 -B'
+	fi
 	case $build_os in
 	mingw*) lt_bad_file=conftest.nm/nofile ;;
 	*) lt_bad_file=/dev/null ;;
 	esac
-	case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in
+	case `"$tmp_nm" $tmp_nmflags $lt_bad_file 2>&1 | sed '1q'` in
 	*$lt_bad_file* | *'Invalid file or object type'*)
-	  lt_cv_path_NM="$tmp_nm -B"
+	  lt_cv_path_NM="$tmp_nm $tmp_nmflags"
 	  break 2
 	  ;;
 	*)
@@ -5548,7 +5572,7 @@ _LT_EOF
 	    _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
 	  fi
 	  if test aix != "$with_aix_soname"; then
-	    _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; func_echo_all "# '$gl_cv_powerpc_aix_object_mode'"; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp'
 	  else
 	    # used by -dlpreopen to get the symbols
 	    _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV  $output_objdir/$realname.d/$soname $output_objdir'
@@ -6623,7 +6647,7 @@ if test yes != "$_lt_caught_CXX_error"; then
 	      _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
 	    fi
 	    if test aix != "$with_aix_soname"; then
-	      _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; func_echo_all "# '$gl_cv_powerpc_aix_object_mode'"; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp'
 	    else
 	      # used by -dlpreopen to get the symbols
 	      _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV  $output_objdir/$realname.d/$soname $output_objdir'
diff --git a/m4/ltoptions.m4 b/m4/ltoptions.m4
index b34dd2f..30ffacc 100644
--- a/m4/ltoptions.m4
+++ b/m4/ltoptions.m4
@@ -351,9 +351,7 @@ power*-*-aix[[5-9]]*,yes)
     # For the AIX way of multilib, we name the shared archive member
     # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o',
     # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File.
-    # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag,
-    # the AIX toolchain works better with OBJECT_MODE set (default 32).
-    if test 64 = "${OBJECT_MODE-32}"; then
+    if test 64 = "$gl_cv_powerpc_aix_object_mode"; then
       shared_archive_member_spec=shr_64
     else
       shared_archive_member_spec=shr
-- 
2.4.6
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.