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