This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH, 4.4] ARM PR42503: backport libgcc.so linker script support
- From: Mikael Pettersson <mikpe at it dot uu dot se>
- To: gcc-patches at gcc dot gnu dot org
- Cc: Mikael Pettersson <mikpe at it dot uu dot se>
- Date: Tue, 29 Dec 2009 23:55:33 +0100
- Subject: [PATCH, 4.4] ARM PR42503: backport libgcc.so linker script support
4.5 added support for targets to install libgcc.so as a linker
script that sources in both the shared and the static libgcc.
This is needed when shared libraries like libstdc++ use routines
that the target only provides in the static libgcc. See PR40134.
This patch backports the libgcc.so linker script support and
enables it for arm*-*-linux-*eabi. This fixes PR42503: a recent
regression in 4.4 for ARM where a backport of __sync_syncronize()
support broke libjava because libstdc++ now refers to a routine
that only exists in the static libgcc.
Regression tested on {i686,powerpc64}-linux and armv5tel-linux-gnueabi.
Ok for 4.4? (I don't have write access.)
gcc/
2009-12-29 Mikael Pettersson <mikpe@it.uu.se>
PR target/42503
Backport from mainline:
2009-09-09 Jakub Jelinek <jakub@redhat.com>
* config/t-slibgcc-elf-ver (SHLIB_MAKE_SOLINK, SHLIB_INSTALL_SOLINK):
New variables.
(SHLIB_LINK, SHLIB_INSTALL): Use them.
* config/t-slibgcc-libgcc: New file.
2009-10-19 Matthias Klose <doko@ubuntu.com>
PR target/40134
* config.gcc (arm*-*-linux-*eabi): Use config/t-slibgcc-libgcc.
diff -rupN gcc-4.4.2/gcc/config/t-slibgcc-elf-ver gcc-4.4.2-pr40134/gcc/config/t-slibgcc-elf-ver
--- gcc-4.4.2/gcc/config/t-slibgcc-elf-ver 2005-02-19 12:44:10.000000000 +0100
+++ gcc-4.4.2-pr40134/gcc/config/t-slibgcc-elf-ver 2009-12-29 13:29:27.000000000 +0100
@@ -10,6 +10,9 @@ SHLIB_OBJS = @shlib_objs@
SHLIB_DIR = @multilib_dir@
SHLIB_SLIBDIR_QUAL = @shlib_slibdir_qual@
SHLIB_LC = -lc
+SHLIB_MAKE_SOLINK = $(LN_S) $(SHLIB_SONAME) $(SHLIB_DIR)/$(SHLIB_SOLINK)
+SHLIB_INSTALL_SOLINK = $(LN_S) $(SHLIB_SONAME) \
+ $$(DESTDIR)$$(slibdir)$(SHLIB_SLIBDIR_QUAL)/$(SHLIB_SOLINK)
SHLIB_LINK = $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) -shared -nodefaultlibs \
-Wl,--soname=$(SHLIB_SONAME) \
@@ -22,7 +25,7 @@ SHLIB_LINK = $(GCC_FOR_TARGET) $(LIBGCC2
$(SHLIB_DIR)/$(SHLIB_SONAME).backup; \
else true; fi && \
mv $(SHLIB_DIR)/$(SHLIB_SONAME).tmp $(SHLIB_DIR)/$(SHLIB_SONAME) && \
- $(LN_S) $(SHLIB_SONAME) $(SHLIB_DIR)/$(SHLIB_SOLINK)
+ $(SHLIB_MAKE_SOLINK)
# $(slibdir) double quoted to protect it from expansion while building
# libgcc.mk. We want this delayed until actual install time.
SHLIB_INSTALL = \
@@ -30,7 +33,6 @@ SHLIB_INSTALL = \
$(INSTALL_DATA) $(SHLIB_DIR)/$(SHLIB_SONAME) \
$$(DESTDIR)$$(slibdir)$(SHLIB_SLIBDIR_QUAL)/$(SHLIB_SONAME); \
rm -f $$(DESTDIR)$$(slibdir)$(SHLIB_SLIBDIR_QUAL)/$(SHLIB_SOLINK); \
- $(LN_S) $(SHLIB_SONAME) \
- $$(DESTDIR)$$(slibdir)$(SHLIB_SLIBDIR_QUAL)/$(SHLIB_SOLINK)
+ $(SHLIB_INSTALL_SOLINK)
SHLIB_MKMAP = $(srcdir)/mkmap-symver.awk
SHLIB_MAPFILES = $(srcdir)/libgcc-std.ver
diff -rupN gcc-4.4.2/gcc/config/t-slibgcc-libgcc gcc-4.4.2-pr40134/gcc/config/t-slibgcc-libgcc
--- gcc-4.4.2/gcc/config/t-slibgcc-libgcc 1970-01-01 01:00:00.000000000 +0100
+++ gcc-4.4.2-pr40134/gcc/config/t-slibgcc-libgcc 2009-12-29 13:27:56.000000000 +0100
@@ -0,0 +1,32 @@
+# Copyright (C) 2009 Free Software Foundation, Inc.
+#
+# This file is part of GCC.
+#
+# GCC is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+#
+# GCC is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3. If not see
+# <http://www.gnu.org/licenses/>.
+
+# Instead of creating $(SHLIB_SOLINK) symlink create a GNU ld
+# linker script which sources in both $(SHLIB_SONAME) and libgcc.a.
+# This is needed on targets where libgcc.a contains routines that aren't in
+# $(SHLIB_SONAME) and are needed for shared libraries.
+
+SHLIB_MAKE_SOLINK = \
+ (echo "/* GNU ld script"; \
+ echo " Use the shared library, but some functions are only in"; \
+ echo " the static library. */"; \
+ echo "GROUP ( $(SHLIB_SONAME) libgcc.a )" \
+ ) > $(SHLIB_DIR)/$(SHLIB_SOLINK)
+SHLIB_INSTALL_SOLINK = \
+ $(INSTALL_DATA) $(SHLIB_DIR)/$(SHLIB_SOLINK) \
+ $$(DESTDIR)$$(slibdir)$(SHLIB_SLIBDIR_QUAL)/$(SHLIB_SOLINK)
diff -rupN gcc-4.4.2/gcc/config.gcc gcc-4.4.2-pr40134/gcc/config.gcc
--- gcc-4.4.2/gcc/config.gcc 2009-09-13 15:01:13.000000000 +0200
+++ gcc-4.4.2-pr40134/gcc/config.gcc 2009-12-29 13:30:27.000000000 +0100
@@ -714,7 +714,7 @@ arm*-*-linux*) # ARM GNU/Linux with EL
case ${target} in
arm*-*-linux-*eabi)
tm_file="$tm_file arm/bpabi.h arm/linux-eabi.h"
- tmake_file="$tmake_file arm/t-arm-elf arm/t-bpabi arm/t-linux-eabi"
+ tmake_file="$tmake_file arm/t-arm-elf arm/t-bpabi arm/t-linux-eabi t-slibgcc-libgcc"
# The BPABI long long divmod functions return a 128-bit value in
# registers r0-r3. Correctly modeling that requires the use of
# TImode.