From e52b720870c23511cfc9323a784694c9dd24a0ab Mon Sep 17 00:00:00 2001
From: Felix Fietkau <nbd@openwrt.org>
Date: Tue, 8 Mar 2011 13:10:11 +0000
Subject: [PATCH] gcc: move the optimized assembler helpers back into the
 static libgcc and skip relinking for this arch. due to relocation
 constraints, the assembler functions cannot be in the shared libgcc and must
 always be linked in statically

SVN-Revision: 25952
---
 package/base-files/Makefile                   | 27 ++++++++++++----
 .../linaro/850-use_shared_libgcc.patch        | 31 +++++++------------
 2 files changed, 32 insertions(+), 26 deletions(-)

diff --git a/package/base-files/Makefile b/package/base-files/Makefile
index 07cc8b460a..086dd32bd8 100644
--- a/package/base-files/Makefile
+++ b/package/base-files/Makefile
@@ -326,9 +326,12 @@ endef
 
 LIBGCC_A=$(wildcard $(TOOLCHAIN_DIR)/lib/gcc/*/*/libgcc_pic.a)
 LIBGCC_MAP=$(wildcard $(TOOLCHAIN_DIR)/lib/gcc/*/*/libgcc.map)
-BUILD_LIBGCC:=$(if $(CONFIG_avr32)$(CONFIG_m68k),,$(PKG_BUILD_DIR)/libgcc_s.so.*)
-
+LIBGCC_SO=$(wildcard $(TOOLCHAIN_DIR)/lib/libgcc_s.so.*)
 ifeq ($(CONFIG_EXTERNAL_TOOLCHAIN),)
+  BUILD_LIBGCC:=$(if $(CONFIG_avr32)$(CONFIG_m68k)$(CONFIG_powerpc),,$(PKG_BUILD_DIR)/libgcc_s.so.*)
+endif
+
+ifneq ($(BUILD_LIBGCC),)
   define Build/Compile/uClibc
 	$(SCRIPT_DIR)/relink-lib.sh \
 		"$(TARGET_CROSS)" \
@@ -360,14 +363,26 @@ ifeq ($(CONFIG_EXTERNAL_TOOLCHAIN),)
 		-ldl $(BUILD_LIBGCC) \
 		-Wl,-soname=libpthread.so.0
   endef
-  ifneq ($(BUILD_LIBGCC),)
-    define Build/Compile/libgcc
+  define Build/Compile/libgcc
 	$(SCRIPT_DIR)/relink-lib.sh \
 		"$(TARGET_CROSS)" \
-		"$(wildcard $(TOOLCHAIN_DIR)/lib/libgcc_s.so.*)" \
+		"$(LIBGCC_SO)" \
 		"$(LIBGCC_A)" \
-		"$(patsubst $(TOOLCHAIN_DIR)/lib/%,$(PKG_BUILD_DIR)/%,$(wildcard $(TOOLCHAIN_DIR)/lib/libgcc_s.so.*))" \
+		"$(patsubst $(TOOLCHAIN_DIR)/lib/%,$(PKG_BUILD_DIR)/%,$(LIBGCC_SO))" \
 		-Wl,--version-script=$(LIBGCC_MAP) -Wl,-soname=libgcc_s.so.1
+  endef
+else
+  define Build/Compile/uClibc
+	$(CP) \
+		$(TOOLCHAIN_DIR)/lib/libuClibc-*.so \
+		$(TOOLCHAIN_DIR)/lib/libcrypt-*.so \
+		$(TOOLCHAIN_DIR)/lib/libm-*.so \
+		$(TOOLCHAIN_DIR)/lib/libpthread-*.so \
+		$(PKG_BUILD_DIR)/
+  endef
+  ifneq ($(LIBGCC_SO),)
+    define Build/Compile/libgcc
+	$(CP) $(LIBGCC_SO) $(PKG_BUILD_DIR)/
     endef
   endif
 endif
diff --git a/toolchain/gcc/patches/linaro/850-use_shared_libgcc.patch b/toolchain/gcc/patches/linaro/850-use_shared_libgcc.patch
index a9cc80bfe0..5e33c9d4e1 100644
--- a/toolchain/gcc/patches/linaro/850-use_shared_libgcc.patch
+++ b/toolchain/gcc/patches/linaro/850-use_shared_libgcc.patch
@@ -35,18 +35,6 @@
  /* Determine which dynamic linker to use depending on whether GLIBC or
     uClibc is the default C library and whether -muclibc or -mglibc has
     been passed to change the default.  */
---- a/gcc/config/rs6000/ppc-asm.h
-+++ b/gcc/config/rs6000/ppc-asm.h
-@@ -325,8 +325,7 @@
- FUNC_NAME(name):
- 
- #define HIDDEN_FUNC(name) \
--  FUNC_START(name) \
--  .hidden FUNC_NAME(name);
-+  FUNC_START(name);
- 
- #define FUNC_END(name) \
- GLUE(.L,name): \
 --- a/gcc/mkmap-symver.awk
 +++ b/gcc/mkmap-symver.awk
 @@ -132,5 +132,5 @@
@@ -56,14 +44,6 @@
 -    printf ("\n  local:\n\t*;\n};\n");
 +    printf ("\n\t*;\n};\n");
  }
---- a/libgcc/config/rs6000/t-ppccomm
-+++ b/libgcc/config/rs6000/t-ppccomm
-@@ -1,4 +1,4 @@
--LIB2ADD_ST += crtsavfpr.S crtresfpr.S \
-+LIB2ADD += crtsavfpr.S crtresfpr.S \
-   crtsavgpr.S crtresgpr.S \
-   crtresxfpr.S crtresxgpr.S \
-   e500crtres32gpr.S \
 --- a/libgcc/Makefile.in
 +++ b/libgcc/Makefile.in
 @@ -265,7 +265,7 @@
@@ -75,3 +55,14 @@
  
  ifneq (,$(vis_hide))
  
+--- a/gcc/config/rs6000/linux.h
++++ b/gcc/config/rs6000/linux.h
+@@ -85,6 +85,8 @@
+ #define USE_LD_AS_NEEDED 1
+ #endif
+ 
++#define LIBGCC_SPEC "%{!static:%{!static-libgcc:-lgcc_s}} -lgcc"
++
+ #undef  TARGET_VERSION
+ #define TARGET_VERSION fprintf (stderr, " (PowerPC GNU/Linux)");
+ 
-- 
GitLab