This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]