diff mbox

AIX: Filename-based shared library versioning for libgcc_s

Message ID 54622E80.904@ssi-schaefer.com
State New
Headers show

Commit Message

Michael Haubenwallner Nov. 11, 2014, 3:42 p.m. UTC
On 11/11/2014 04:02 PM, David Edelsohn wrote:
> Michael,
> 
> Why does the configure change match with p*-*-aix... instead of power*
> or powerpc*?  Yes, it's unique and will match, but why make it as
> short as possible, which doesn't match other uses?

Actually I did have powerpc* initially, but gmp-6.0.0 config.guess'ed
power7-ibm-aix6.1.0.0 now. Then I've thought that one may use ppc as well,
but now I see this config.sub's to powerpc anyway, so power* is fine.
Patch updated.

> In your documentation, how are you distinguishing between Dynamic
> Linking and Runtime Linking?

I've tried to use the same naming scheme as in the "ld Command Reference"
and the "dlopen Subroutine" man pages.

Actually, there is
at linktime:
  Dynamic Linking: also known as Dynamic Mode or (more common)
   Shared Linking: record a shared object's name into the created binary

at runtime:
  Runtime Loading: load these shared objects at process startup
  Runtime Linking: resolve the symbols after loading shared objects
  Dynamic Loading: load shared objects by application logic with dlopen()

I'm unsure how to make this as clear as possible though.

Thanks!
/haubi/
> 
> Thanks, David
> 
> 
> On Mon, Nov 10, 2014 at 12:41 PM, Michael Haubenwallner
> <michael.haubenwallner@ssi-schaefer.com> wrote:
>>
>>
>> Am 2014-11-10 17:06, schrieb David Edelsohn:
>>> On Mon, Nov 10, 2014 at 4:59 AM, Michael Haubenwallner
>>> <michael.haubenwallner@ssi-schaefer.com> wrote:
>>>>
>>>> Am 2014-11-07 20:52, schrieb David Edelsohn:
>>>>> First, please explicitly copy me on AIX or PowerPC patches sent to gcc-patches.
>>>>>
>>>>> I don't have a fundamental objection to including this option, but
>>>>> note that Richi, Honza and I have discovered that using AIX runtime
>>>>> linking option interacts badly with some GCC optimizations and can
>>>>> result in applications that hang in a loop.
>>>>
>>>> Feels like adding the "aix-soname" linking procedure becomes more important:
>>>>
>>>>> All code on AIX is position independent (PIC) by default.  Executables
>>>>> and shared libraries essentially are PIE.  Because of this, AIX does
>>>>> not provide separate "static" libraries and one can link statically
>>>>> with a shared library.
>>>>>
>>>>> Creating a library enabled for runtime linking with -G (-brtl), causes
>>>>> a lot of problems, including a newly recognized failure mode.  Without
>>>>> careful control over AIX symbol export, all global calls with use
>>>>> glink code (equivalent to ELF PLTs). This also creates a TOC entry for
>>>>> every global call, possibly overflowing the TOC.
>>>>
>>>> About to define "careful control over AIX symbol export":
>>>> The symbols listed in the import file are those found in the object files
>>>> only, not the ones created at linktime (like __GLOBAL*) or from the static
>>>> objects found in libc.a. While I do this in libtool from the beginning here,
>>>> I have had a helper script wrapping ld to support '--soname=' for non-libtool
>>>> packages, where creating the import file from the final shared object also
>>>> included static libc-provided symbols, which turned out as dependency pitfall.
>>>
>>> AIX added ELF-like visibility support to XCOFF, which would be
>>> preferred.  Except it was not added in a formal release, like AIX 8.1
>>> and apparently was back-ported to at least AIX 6.1, so its difficult
>>> to phase in the support. One would need to add a configure test for
>>> the feature and not all users are upgrading the system. So one cannot
>>> build and distribute "GCC for AIX 7.1" and know the feature is
>>> available in the system tools.  GCC builds would be incompatible and
>>> object files, libraries, executables created by GCC would be
>>> incompatible.  Basically, a mess.
>>
>> As I've seen the "weak" information on an older AIX 5.3 TL8 already:
>> Is this visibility support something different than what "nm -l" or "nm -P" shows?
>>
>>>> While I haven't focussed on nor explicitly tested, I do believe that this
>>>> also solves problems with global C++ constructor/destructor call orders.
>>>
>>> Why? There still is the problem of the AIX kernel runtime loader
>>> ordering dependent shared objects.
>>
>> Feels like I indeed haven't digged deep enough into that topic yet:
>> To be ignored here then.
>>
>>>>> But the main problem is GCC uses aliases and functions declared as
>>>>> weak to support some C++ features.
>>>>
>>>> This is another reason why I do force runtime linking for our application,
>>>> which uses these C++ features while its main target platform is Linux.
>>>
>>> You have not explained how this has any fix / benefit affecting the
>>> problem, other than separate shared and static libraries.  Forcing
>>> runtime linking seems irrelevant.  It was linking shared before and
>>> linking shared after your patch (with runtime linking) so the net
>>> effect is zero.
>>
>> My main reason here is to allow for *filename*-based sharedlib versioning,
>> which I haven't been able to achive without import files.
>> In-archive versioning is a pita from a package manager's point of view.
>>
>> For a second reason:
>> Due to its Linux-centric history (well, HP-UX and Solaris before), our
>> application architecture does rely on runtime linking in some corner cases.
>> This is why I force that for AIX in our development- and runtime-platform,
>> which is similar to /opt/freeware/, but based on Gentoo Prefix.
>>
>> For a third reason (maybe I don't have deep enough insight as well):
>> If I understand correctly, you switched to build libstdc++ without runtime
>> linking, because of problems when linking statically against the rtl-enabled
>> libstdc++, no? For this case, by incident "aix-soname" does prevent shared
>> objects built with runtime linking from being statically linked.
>>
>> For another reason: I can imaging to provide an rtl_enable'd libc.so as
>> well, to allow for easier use of memory debuggers that intercept the
>> malloc/free &co libc calls... But AFAICT these rely on every sharedlib
>> to be built with runtime linking enabled.
>>
>>> Again, runtime linking of all global symbols affects performance and
>>> bloats the TOC, making TOC overflow more likely.
>>
>> Well, I don't have need to care for performance that much. So do I force
>> -mminimal-toc as well, where the only reason I have seen so far to avoid
>> the -bbigtoc linker flag instead is that gdb has problems with that.
>>
>>> I don't have a fundamental objection to the patch, but you have not
>>> really responded to the potential problems and any motivation for this
>>> feature other than greater SVR4 emulation.  For better or worse, AIX
>>> is not SVR4.  Every library built with this option hurts performance
>>> on AIX and potentially causes mysterious TOC overflow errors, which
>>> confuse users unfamiliar with AIX and whose workarounds hurt
>>> performance even more.
>>
>> Looking more like SVR4 is nothing more than a nice side effect when doing
>> filename-based shlib-versioning this proposed way, not a reason by itself.
>>
>> Which potential problems do you think of? I fail to find more pointers...
>>
>> Thanks!
>> /haubi/

Comments

David Edelsohn Nov. 25, 2014, 1:53 p.m. UTC | #1
On Tue, Nov 11, 2014 at 10:42 AM, Michael Haubenwallner
<michael.haubenwallner@ssi-schaefer.com> wrote:
>
>
> On 11/11/2014 04:02 PM, David Edelsohn wrote:
>> Michael,
>>
>> Why does the configure change match with p*-*-aix... instead of power*
>> or powerpc*?  Yes, it's unique and will match, but why make it as
>> short as possible, which doesn't match other uses?
>
> Actually I did have powerpc* initially, but gmp-6.0.0 config.guess'ed
> power7-ibm-aix6.1.0.0 now. Then I've thought that one may use ppc as well,
> but now I see this config.sub's to powerpc anyway, so power* is fine.
> Patch updated.
>
>> In your documentation, how are you distinguishing between Dynamic
>> Linking and Runtime Linking?
>
> I've tried to use the same naming scheme as in the "ld Command Reference"
> and the "dlopen Subroutine" man pages.
>
> Actually, there is
> at linktime:
>   Dynamic Linking: also known as Dynamic Mode or (more common)
>    Shared Linking: record a shared object's name into the created binary
>
> at runtime:
>   Runtime Loading: load these shared objects at process startup
>   Runtime Linking: resolve the symbols after loading shared objects
>   Dynamic Loading: load shared objects by application logic with dlopen()
>
> I'm unsure how to make this as clear as possible though.

Now that things have calmed down with respect to breakage on AIX, the
patch for building libgcc_s is okay.

Thanks, David
Michael Haubenwallner Dec. 5, 2014, 12:56 p.m. UTC | #2
On 11/25/2014 02:53 PM, David Edelsohn wrote:
> 
> Now that things have calmed down with respect to breakage on AIX, the
> patch for building libgcc_s is okay.

FYI:

libtool-2.4.4 does support "--with-aix-soname=aix|both|svr4" now too,
http://thread.gmane.org/gmane.comp.gnu.libtool.patches/11789/focus=11802

Is there a libtool upgrade planned for gcc-5 as well?

Thanks!
/haubi/
David Edelsohn Dec. 5, 2014, 2:06 p.m. UTC | #3
On Fri, Dec 5, 2014 at 7:56 AM, Michael Haubenwallner
<michael.haubenwallner@ssi-schaefer.com> wrote:
>
> On 11/25/2014 02:53 PM, David Edelsohn wrote:
>>
>> Now that things have calmed down with respect to breakage on AIX, the
>> patch for building libgcc_s is okay.
>
> FYI:
>
> libtool-2.4.4 does support "--with-aix-soname=aix|both|svr4" now too,
> http://thread.gmane.org/gmane.comp.gnu.libtool.patches/11789/focus=11802
>
> Is there a libtool upgrade planned for gcc-5 as well?

Patches are backported as needed.

- David
diff mbox

Patch

From 039cfacb45d830fb2d34b1fff466822027b3abb5 Mon Sep 17 00:00:00 2001
From: Michael Haubenwallner <michael.haubenwallner@salomon.at>
Date: Fri, 16 Mar 2012 14:49:20 +0100
Subject: [PATCH] AIX: Filename-based shlib versioning for libgcc_s

2014-11-11  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.in: Accept --with-aix-soname=aix|svr4|both option.
	* configure: Recreate.
---
 gcc/doc/install.texi               | 114 +++++++++++++++++++++++++++++++++++++
 libgcc/Makefile.in                 |   1 +
 libgcc/config/rs6000/t-slibgcc-aix |  82 ++++++++++++++++++++------
 libgcc/configure                   |  28 +++++++++
 libgcc/configure.ac                |  17 ++++++
 5 files changed, 226 insertions(+), 16 deletions(-)

diff --git a/gcc/doc/install.texi b/gcc/doc/install.texi
index fa5fe6e..74d59d0 100644
--- a/gcc/doc/install.texi
+++ b/gcc/doc/install.texi
@@ -1399,6 +1399,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
@@ -3832,6 +3940,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
@@ -3862,6 +3971,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
diff --git a/libgcc/Makefile.in b/libgcc/Makefile.in
index 357e15c..1982653 100644
--- a/libgcc/Makefile.in
+++ b/libgcc/Makefile.in
@@ -42,6 +42,7 @@  decimal_float = @decimal_float@
 enable_vtable_verify = @enable_vtable_verify@
 enable_decimal_float = @enable_decimal_float@
 fixed_point = @fixed_point@
+with_aix_soname = @with_aix_soname@
 
 host_noncanonical = @host_noncanonical@
 target_noncanonical = @target_noncanonical@
diff --git a/libgcc/config/rs6000/t-slibgcc-aix b/libgcc/config/rs6000/t-slibgcc-aix
index 288c2c9..2de307e 100644
--- a/libgcc/config/rs6000/t-slibgcc-aix
+++ b/libgcc/config/rs6000/t-slibgcc-aix
@@ -16,24 +16,74 @@ 
 # 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
diff --git a/libgcc/configure b/libgcc/configure
index 3f53aaf..ec184e6 100644
--- a/libgcc/configure
+++ b/libgcc/configure
@@ -609,6 +609,7 @@  build_os
 build_vendor
 build_cpu
 build
+with_aix_soname
 enable_vtable_verify
 enable_shared
 libgcc_topdir
@@ -658,6 +659,7 @@  with_cross_host
 with_ld
 enable_shared
 enable_vtable_verify
+with_aix_soname
 enable_version_specific_runtime_libs
 with_slibdir
 enable_maintainer_mode
@@ -1316,6 +1318,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
@@ -2165,6 +2170,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
diff --git a/libgcc/configure.ac b/libgcc/configure.ac
index 79d0ea4..3de5d8f 100644
--- a/libgcc/configure.ac
+++ b/libgcc/configure.ac
@@ -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)
 
-- 
1.8.5.5