(libgcc_s) Optional filename-based shared library versioning on AIX.
authorMichael Haubenwallner <michael.haubenwallner@ssi-schaefer.com>
Tue, 9 Dec 2014 20:48:48 +0000 (20:48 +0000)
committerDavid Edelsohn <dje@gcc.gnu.org>
Tue, 9 Dec 2014 20:48:48 +0000 (15:48 -0500)
2014-12-09  Michael Haubenwallner <michael.haubenwallner@ssi-schaefer.com>

        (libgcc_s) Optional filename-based shared library versioning on AIX.
        * gcc/doc/install.texi: Describe --with-aix-soname option.
        * Makefile.in (with_aix_soname): Define.
        * config/rs6000/t-slibgcc-aix: Act upon --with-aix-soname option.
        * configure.ac: Accept --with-aix-soname=aix|svr4|both option.
        * configure: Recreate.

From-SVN: r218539

gcc/ChangeLog
gcc/doc/install.texi
libgcc/ChangeLog
libgcc/config/rs6000/t-slibgcc-aix
libgcc/configure
libgcc/configure.ac

index dc7e080290982a1eeb79d43a58a8cb785c561c47..20bcbaa2abaffc4ab50a562cbc9677ed9a816017 100644 (file)
@@ -1,3 +1,7 @@
+2014-12-09  Michael Haubenwallner <michael.haubenwallner@ssi-schaefer.com>
+
+       * doc/install.texi: Describe --with-aix-soname option.
+
 2014-12-09  Alan Lawrence  <alan.lawrence@arm.com>
 
        * config/aarch64/aarch64-simd.md (aarch64_get_lanedi): Remove.
index 59bbac7382d6fe34ec689a4d78bf204e29f73ec0..488c1f83a520e8dc597f11aae118880d99d1ca15 100644 (file)
@@ -1430,6 +1430,114 @@ particularly useful if you intend to use several versions of GCC in
 parallel.  This is currently supported by @samp{libgfortran},
 @samp{libjava}, @samp{libstdc++}, and @samp{libobjc}.
 
+@item @anchor{WithAixSoname}--with-aix-soname=@samp{aix}, @samp{svr4} or @samp{both}
+Traditional AIX shared library versioning (versioned @code{Shared Object}
+files as members of unversioned @code{Archive Library} files named
+@samp{lib.a}) causes numerous headaches for package managers. However,
+@code{Import Files} as members of @code{Archive Library} files allow for
+@strong{filename-based versioning} of shared libraries as seen on Linux/SVR4,
+where this is called the "SONAME". But as they prevent static linking,
+@code{Import Files} may be used with @code{Runtime Linking} only, where the
+linker does search for @samp{libNAME.so} before @samp{libNAME.a} library
+filenames with the @samp{-lNAME} linker flag.
+
+@anchor{AixLdCommand}For detailed information please refer to the AIX
+@uref{http://www-01.ibm.com/support/knowledgecenter/search/%22the%20ld%20command%2C%20also%20called%20the%20linkage%20editor%20or%20binder%22,,ld
+Command} reference.
+
+As long as shared library creation is enabled, upon:
+@table @code
+@item --with-aix-soname=aix
+@item --with-aix-soname=both
+ A (traditional AIX) @code{Shared Archive Library} file is created:
+ @itemize @bullet
+  @item using the @samp{libNAME.a} filename scheme
+  @item with the @code{Shared Object} file as archive member named
+  @samp{libNAME.so.V} (except for @samp{libgcc_s}, where the @code{Shared
+  Object} file is named @samp{shr.o} for backwards compatibility), which
+  @itemize @minus
+   @item is used for runtime loading from inside the @samp{libNAME.a} file
+   @item is used for dynamic loading via
+   @code{dlopen("libNAME.a(libNAME.so.V)", RTLD_MEMBER)}
+   @item is used for shared linking
+   @item is used for static linking, so no separate @code{Static Archive
+   Library} file is needed
+  @end itemize
+ @end itemize
+@item --with-aix-soname=both
+@item --with-aix-soname=svr4
+ A (second) @code{Shared Archive Library} file is created:
+ @itemize @bullet
+ @item using the @samp{libNAME.so.V} filename scheme
+ @item with the @code{Shared Object} file as archive member named
+ @samp{shr.o}, which
+  @itemize @minus
+   @item is created with the @code{-G linker flag}
+   @item has the @code{F_LOADONLY} flag set
+   @item is used for runtime loading from inside the @samp{libNAME.so.V} file
+   @item is used for dynamic loading via @code{dlopen("libNAME.so.V(shr.o)",
+   RTLD_MEMBER)}
+  @end itemize
+ @item with the @code{Import File} as archive member named @samp{shr.imp},
+ which
+  @itemize @minus
+   @item refers to @samp{libNAME.so.V(shr.o)} as the "SONAME", to be recorded
+   in the @code{Loader Section} of subsequent binaries
+   @item indicates whether @samp{libNAME.so.V(shr.o)} is 32 or 64 bit
+   @item lists all the public symbols exported by @samp{lib.so.V(shr.o)},
+   eventually decorated with the @code{@samp{weak} Keyword}
+   @item is necessary for shared linking against @samp{lib.so.V(shr.o)}
+   @end itemize
+  @end itemize
+  A symbolic link using the @samp{libNAME.so} filename scheme is created:
+  @itemize @bullet
+  @item pointing to the @samp{libNAME.so.V} @code{Shared Archive Library} file
+  @item to permit the @code{ld Command} to find @samp{lib.so.V(shr.imp)} via
+  the @samp{-lNAME} argument (requires @code{Runtime Linking} to be enabled)
+  @item to permit dynamic loading of @samp{lib.so.V(shr.o)} without the need
+  to specify the version number via @code{dlopen("libNAME.so(shr.o)",
+  RTLD_MEMBER)}
+  @end itemize
+@end table
+
+As long as static library creation is enabled, upon:
+@table @code
+@item --with-aix-soname=svr4
+ A @code{Static Archive Library} is created:
+ @itemize @bullet
+ @item using the @samp{libNAME.a} filename scheme
+ @item with all the @code{Static Object} files as archive members, which
+  @itemize @minus
+   @item are used for static linking
+  @end itemize
+ @end itemize
+@end table
+
+While the aix-soname=@samp{svr4} option does not create @code{Shared Object}
+files as members of unversioned @code{Archive Library} files any more, package
+managers still are responsible to
+@uref{./specific.html#TransferAixShobj,,transfer} @code{Shared Object} files
+found as member of a previously installed unversioned @code{Archive Library}
+file into the newly installed @code{Archive Library} file with the same
+filename.
+
+@emph{WARNING:} Creating @code{Shared Object} files with @code{Runtime Linking}
+enabled may bloat the TOC, eventually leading to @code{TOC overflow} errors,
+requiring the use of either the @option{-Wl,-bbigtoc} linker flag (seen to
+break with the @code{GDB} debugger) or some of the TOC-related compiler flags,
+@ifnothtml
+@xref{RS/6000 and PowerPC Options,, RS/6000 and PowerPC Options, gcc,
+Using the GNU Compiler Collection (GCC)}.
+@end ifnothtml
+@ifhtml
+see ``RS/6000 and PowerPC Options'' in the main manual.
+@end ifhtml
+
+@option{--with-aix-soname} is currently supported by @samp{libgcc_s} only, so
+this option is still experimental and not for normal use yet.
+
+Default is the traditional behaviour @option{--with-aix-soname=@samp{aix}}.
+
 @item --enable-languages=@var{lang1},@var{lang2},@dots{}
 Specify that only a particular subset of compilers and
 their runtime libraries should be built.  For a list of valid values for
@@ -3878,6 +3986,7 @@ APAR IY26685 (AIX 4.3) or APAR IY25528 (AIX 5.1).  It also requires a
 fix for another AIX Assembler bug and a co-dependent AIX Archiver fix
 referenced as APAR IY53606 (AIX 5.2) or as APAR IY54774 (AIX 5.1)
 
+@anchor{TransferAixShobj}
 @samp{libstdc++} in GCC 3.4 increments the major version number of the
 shared object and GCC installation places the @file{libstdc++.a}
 shared library in a common location which will overwrite the and GCC
@@ -3908,6 +4017,11 @@ Archive the runtime-only shared object in the GCC 3.4
 % ar -q libstdc++.a libstdc++.so.4 libstdc++.so.5
 @end smallexample
 
+Eventually, the
+@uref{./configure.html#WithAixSoname,,@option{--with-aix-soname=svr4}}
+configure option may drop the need for this procedure for libraries that
+support it.
+
 Linking executables and shared libraries may produce warnings of
 duplicate symbols.  The assembly files generated by GCC for AIX always
 have included multiple symbol definitions for certain global variable
index ce8c1f7470f25c23c029ca57c0bef6d04745dea0..2ee1476e79852e69c9a77d981b662ef9fff9bf95 100644 (file)
@@ -1,3 +1,10 @@
+2015-12-09  Michael Haubenwallner <michael.haubenwallner@ssi-schaefer.com>
+
+       * Makefile.in (with_aix_soname): Define.
+       * config/rs6000/t-slibgcc-aix: Act upon --with-aix-soname option.
+       * configure.ac: Accept --with-aix-soname=aix|svr4|both option.
+       * configure: Recreate.
+
 2014-12-05  Olivier Hainque  <hainque@adacore.com>
 
        * unwind-dw2.c (DWARF_REG_TO_UNWIND_COLUMN): Remove default def,
index 288c2c9a4aaa6dc18c7c81d3566515915dc0ebf5..2de307e91cc9b57bbee69947662e138e37b25560 100644 (file)
 # along with GCC; see the file COPYING3.  If not see
 # <http://www.gnu.org/licenses/>.
 
-# Build a shared libgcc library.
-SHLIB_EXT = .a
-SHLIB_LINK = $(CC) $(LIBGCC2_CFLAGS) -shared -nodefaultlibs \
-       -Wl,-bE:@shlib_map_file@ -o @multilib_dir@/shr.o \
-       @multilib_flags@ @shlib_objs@ -lc \
-       `case @multilib_dir@ in \
-       *pthread*) echo -L$(TARGET_SYSTEM_ROOT)/usr/lib/threads -lpthreads -lc_r $(TARGET_SYSTEM_ROOT)/usr/lib/libc.a ;; \
-       *) echo -lc ;; esac` ; \
-       rm -f @multilib_dir@/tmp-@shlib_base_name@.a ; \
-       $(AR_CREATE_FOR_TARGET) @multilib_dir@/tmp-@shlib_base_name@.a \
-       @multilib_dir@/shr.o ; \
-       mv @multilib_dir@/tmp-@shlib_base_name@.a \
-          @multilib_dir@/@shlib_base_name@.a ; \
-       rm -f @multilib_dir@/shr.o
+# Build a shared libgcc library according to --with-aix-soname selection:
+# aix-soname=aix:
+#       libgcc_s.a(shr.o)                # traditional (-bnortl)
+#
+# aix-soname=both:
+#       libgcc_s.a(shr.o)                # traditional (-bnortl)
+#       libgcc_s.so.1(shrXX.o,shrXX.imp) # the SONAME (-G)
+#       libgcc_s.so -> libgcc_s.so.1     # the symlink
+#
+# aix-soname=svr4:
+#       libgcc_s.so.1(shrXX.o,shrXX.imp) # the SONAME (-G)
+#       libgcc_s.so -> libgcc_s.so.1     # the symlink
+SHLIB_EXT_aix = .a
+SHLIB_EXT_both = .so
+SHLIB_EXT_svr4 = .so
+SHLIB_EXT = $(SHLIB_EXT_$(with_aix_soname))
+SHLIB_SOVERSION = 1
+SHLIB_SONAME = @shlib_base_name@.so.$(SHLIB_SOVERSION)
+SHLIB_LINK = \
+       if test svr4 != $(with_aix_soname) ; then \
+         $(CC) $(LIBGCC2_CFLAGS) -shared -Wl,-bnortl -nodefaultlibs \
+         -Wl,-bE:@shlib_map_file@ -o @multilib_dir@/shr.o \
+         @multilib_flags@ @shlib_objs@ -lc \
+         `case @multilib_dir@ in \
+         *pthread*) echo -L$(TARGET_SYSTEM_ROOT)/usr/lib/threads -lpthreads -lc_r $(TARGET_SYSTEM_ROOT)/usr/lib/libc.a ;; \
+         *) echo -lc ;; esac` ; \
+         rm -f @multilib_dir@/tmp-@shlib_base_name@.a ; \
+         $(AR_CREATE_FOR_TARGET) @multilib_dir@/tmp-@shlib_base_name@.a \
+           @multilib_dir@/shr.o ; \
+         mv @multilib_dir@/tmp-@shlib_base_name@.a \
+            @multilib_dir@/@shlib_base_name@.a ; \
+         rm -f @multilib_dir@/shr.o ; \
+       fi ; \
+       if test aix != $(with_aix_soname) ; then \
+         case @multilib_dir@ in *64*) shr='shr_64' ;; *) shr='shr' ;; esac ; \
+         $(CC) $(LIBGCC2_CFLAGS) -shared -Wl,-G -nodefaultlibs \
+         -Wl,-bE:@shlib_map_file@ -o @multilib_dir@/$$shr.o \
+         @multilib_flags@ @shlib_objs@ -lc \
+         `case @multilib_dir@ in \
+         *pthread*) echo -L$(TARGET_SYSTEM_ROOT)/usr/lib/threads -lpthreads -lc_r $(TARGET_SYSTEM_ROOT)/usr/lib/libc.a ;; \
+         *) echo -lc ;; esac` ; \
+         $(STRIP_FOR_TARGET) -X32_64 -e @multilib_dir@/$$shr.o ; \
+         { echo "\#! $(SHLIB_SONAME)($$shr.o)" ; \
+           case @multilib_dir@ in *64*) echo '\# 64' ;; *) echo '\# 32' ;; esac ; \
+           cat @shlib_map_file@ ; \
+         } > @multilib_dir@/$$shr.imp ; \
+         rm -f @multilib_dir@/tmp-$(SHLIB_SONAME) ; \
+         $(AR_CREATE_FOR_TARGET) @multilib_dir@/tmp-$(SHLIB_SONAME) \
+           @multilib_dir@/$$shr.imp @multilib_dir@/$$shr.o ; \
+         mv @multilib_dir@/tmp-$(SHLIB_SONAME) \
+            @multilib_dir@/$(SHLIB_SONAME) ; \
+         rm -f @multilib_dir@/@shlib_base_name@.so ; \
+         $(LN_S) $(SHLIB_SONAME) @multilib_dir@/@shlib_base_name@.so ; \
+         rm -f @multilib_dir@/$$shr.imp @multilib_dir@/$$shr.o ; \
+       fi
 SHLIB_INSTALL = \
        $(mkinstalldirs) $(DESTDIR)$(slibdir)@shlib_slibdir_qual@; \
-       $(INSTALL_DATA) @multilib_dir@/@shlib_base_name@.a \
-               $(DESTDIR)$(slibdir)@shlib_slibdir_qual@/
+       if test svr4 != $(with_aix_soname) ; then \
+         $(INSTALL_DATA) @multilib_dir@/@shlib_base_name@.a \
+                 $(DESTDIR)$(slibdir)@shlib_slibdir_qual@/ ; \
+       fi ; \
+       if test aix != $(with_aix_soname) ; then \
+         $(INSTALL_DATA) @multilib_dir@/$(SHLIB_SONAME) \
+                 $(DESTDIR)$(slibdir)@shlib_slibdir_qual@/ ; \
+         rm -f $(DESTDIR)$(slibdir)@shlib_slibdir_qual@/@shlib_base_name@.so ; \
+         $(LN_S) $(SHLIB_SONAME) \
+                 $(DESTDIR)$(slibdir)@shlib_slibdir_qual@/@shlib_base_name@.so ; \
+       fi
 SHLIB_LIBS = -lc `case @multilib_dir@ in *pthread*) echo -lpthread ;; esac`
 SHLIB_MKMAP = $(srcdir)/mkmap-flat.awk
 SHLIB_MAPFILES = libgcc-std.ver
index 87924653210b506dccc6a2e0039e6f15697c0048..8480dd132c7a0182c0fec843da3040ec6e1d70b6 100644 (file)
@@ -610,6 +610,7 @@ build_os
 build_vendor
 build_cpu
 build
+with_aix_soname
 enable_vtable_verify
 enable_shared
 libgcc_topdir
@@ -659,6 +660,7 @@ with_cross_host
 with_ld
 enable_shared
 enable_vtable_verify
+with_aix_soname
 enable_version_specific_runtime_libs
 with_slibdir
 enable_maintainer_mode
@@ -1317,6 +1319,9 @@ Optional Packages:
   --with-target-subdir=SUBDIR      Configuring in a subdirectory for target
   --with-cross-host=HOST           Configuring with a cross compiler
   --with-ld               arrange to use the specified ld (full pathname)
+  --with-aix-soname=aix|svr4|both
+                          shared library versioning (aka "SONAME") variant to
+                          provide on AIX
   --with-slibdir=DIR      shared libraries in DIR LIBDIR
   --with-build-libsubdir=DIR  Directory where to find libraries for build system
   --with-system-libunwind use installed libunwind
@@ -2166,6 +2171,29 @@ fi
 
 
 
+
+# Check whether --with-aix-soname was given.
+if test "${with_aix_soname+set}" = set; then :
+  withval=$with_aix_soname; case "${host}:${enable_shared}" in
+ power*-*-aix[5-9]*:yes)
+   { $as_echo "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide for shared libgcc" >&5
+$as_echo_n "checking which variant of shared library versioning to provide for shared libgcc... " >&6; }
+   case ${withval} in
+     aix|svr4|both) ;;
+     *) as_fn_error "Unknown argument to --with-aix-soname" "$LINENO" 5;;
+   esac
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $withval" >&5
+$as_echo "$withval" >&6; }
+   ;;
+ *) with_aix_soname=aix ;;
+ esac
+
+else
+  with_aix_soname=aix
+fi
+
+
+
 # Make sure we can run config.sub.
 $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
   as_fn_error "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
index ab9c5562e288a8bb87779fa4b8c2e3a9f18d4260..23d5f35af57dc658f079f3215769860fc221b7e7 100644 (file)
@@ -76,6 +76,23 @@ AC_ARG_ENABLE(vtable-verify,
 [enable_vtable_verify=no])
 AC_SUBST(enable_vtable_verify)
 
+AC_ARG_WITH(aix-soname,
+[AS_HELP_STRING([--with-aix-soname=aix|svr4|both],
+    [shared library versioning (aka "SONAME") variant to provide on AIX])],
+[case "${host}:${enable_shared}" in
+ power*-*-aix[[5-9]]*:yes)
+   AC_MSG_CHECKING([which variant of shared library versioning to provide for shared libgcc])
+   case ${withval} in
+     aix|svr4|both) ;;
+     *) AC_MSG_ERROR([Unknown argument to --with-aix-soname]);;
+   esac
+   AC_MSG_RESULT($withval)
+   ;;
+ *) with_aix_soname=aix ;;
+ esac
+], [with_aix_soname=aix])
+AC_SUBST(with_aix_soname)
+
 GCC_PICFLAG
 AC_SUBST(PICFLAG)