(libgcc_s) Optional filename-based shared library versioning on AIX.

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
This commit is contained in:
Michael Haubenwallner 2014-12-09 20:48:48 +00:00 committed by David Edelsohn
parent 2712de7892
commit dd91332382
6 changed files with 236 additions and 16 deletions

View 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.

View 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

View 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,

View File

@ -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

28
libgcc/configure vendored
View 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

View 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)