(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:
parent
2712de7892
commit
dd91332382
6 changed files with 236 additions and 16 deletions
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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
28
libgcc/configure
vendored
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue