+++ /dev/null
-Upstream-Status: Backport
-Signed-off-by: Khem Raj <raj.khem@gmail.com>
-
-From 95f5a9a866695da4e038aa4e6ccbbfd5d9cf63b7 Mon Sep 17 00:00:00 2001
-From: Joseph Myers <joseph@codesourcery.com>
-Date: Tue, 3 Jul 2012 19:14:59 +0000
-Subject: [PATCH] Avoid use of libgcc_s and libgcc_eh when building glibc.
-
----
- ChangeLog | 47 ++++++++++++++++++++++++++++++
- Makeconfig | 68 ++++++++++++++++++++++++++++++++++++++------
- Rules | 45 ++++++++++++++++++++++-------
- elf/Makefile | 6 +++-
- elf/static-stubs.c | 46 ++++++++++++++++++++++++++++++
- ports/ChangeLog.arm | 7 +++++
- ports/sysdeps/arm/Makefile | 8 ++++++
- 7 files changed, 206 insertions(+), 21 deletions(-)
- create mode 100644 elf/static-stubs.c
-
-Index: a/libc/Makeconfig
-===================================================================
---- a/libc/Makeconfig 2012-07-04 18:26:22.000000000 -0700
-+++ b/libc/Makeconfig 2012-08-14 20:16:10.197093639 -0700
-@@ -415,9 +415,9 @@
- LDFLAGS-rtld += $(hashstyle-LDFLAGS)
- endif
-
--# Command for linking programs with the C library.
-+# Commands for linking programs with the C library.
- ifndef +link
--+link = $(CC) -nostdlib -nostartfiles -o $@ \
-++link-before-libc = $(CC) -nostdlib -nostartfiles -o $@ \
- $(sysdep-LDFLAGS) $(config-LDFLAGS) $(LDFLAGS) $(LDFLAGS-$(@F)) \
- $(combreloc-LDFLAGS) $(relro-LDFLAGS) $(hashstyle-LDFLAGS) \
- $(addprefix $(csu-objpfx),$(start-installed-name)) \
-@@ -426,7 +426,10 @@
- $(start-installed-name))\
- $(+preinit) $(link-extra-libs) \
- $(common-objpfx)libc% $(+postinit),$^) \
-- $(link-extra-libs) $(link-libc) $(+postctor) $(+postinit)
-+ $(link-extra-libs)
-++link-after-libc = $(+postctor) $(+postinit)
-++link = $(+link-before-libc) $(link-libc) $(+link-after-libc)
-++link-tests = $(+link-before-libc) $(link-libc-tests) $(+link-after-libc)
- endif
- # Command for linking PIE programs with the C library.
- ifndef +link-pie
-@@ -443,7 +446,7 @@
- endif
- # Command for statically linking programs with the C library.
- ifndef +link-static
--+link-static = $(CC) -nostdlib -nostartfiles -static -o $@ \
-++link-static-before-libc = $(CC) -nostdlib -nostartfiles -static -o $@ \
- $(sysdep-LDFLAGS) $(LDFLAGS) $(LDFLAGS-$(@F)) \
- $(addprefix $(csu-objpfx),$(static-start-installed-name)) \
- $(+preinit) $(+prector) \
-@@ -451,7 +454,12 @@
- $(start-installed-name))\
- $(+preinit) $(link-extra-libs-static) \
- $(common-objpfx)libc% $(+postinit),$^) \
-- $(link-extra-libs-static) $(link-libc-static) $(+postctor) $(+postinit)
-+ $(link-extra-libs-static) $(link-libc-static)
-++link-static-after-libc = $(+postctor) $(+postinit)
-++link-static = $(+link-static-before-libc) $(link-libc-static) \
-+ $(+link-static-after-libc)
-++link-static-tests = $(+link-static-before-libc) $(link-libc-static-tests) \
-+ $(+link-static-after-libc)
- endif
- # Command for statically linking bounded-pointer programs with the C library.
- ifndef +link-bounded
-@@ -475,10 +483,12 @@
- # We need the versioned name of libc.so in the deps of $(others) et al
- # so that the symlink to libc.so is created before anything tries to
- # run the linked programs.
--link-libc = -Wl,-rpath-link=$(rpath-link) \
-+link-libc-before-gnulib = -Wl,-rpath-link=$(rpath-link) \
- $(common-objpfx)libc.so$(libc.so-version) \
- $(common-objpfx)$(patsubst %,$(libtype.oS),c) \
-- $(as-needed) $(common-objpfx)elf/ld.so $(no-as-needed) $(gnulib)
-+ $(as-needed) $(common-objpfx)elf/ld.so $(no-as-needed)
-+link-libc = $(link-libc-before-gnulib) $(gnulib)
-+link-libc-tests = $(link-libc-before-gnulib) $(gnulib-tests)
- # This is how to find at build-time things that will be installed there.
- rpath-dirs = math elf dlfcn nss nis rt resolv crypt
- rpath-link = \
-@@ -488,6 +498,7 @@
- nssobjdir := $(patsubst ../$(subdir),.,$(common-objpfx)nss)
- resolvobjdir := $(patsubst ../$(subdir),.,$(common-objpfx)resolv)
- link-libc = $(common-objpfx)libc.a $(otherlibs) $(gnulib) $(common-objpfx)libc.a $(gnulib)
-+link-libc-tests = $(common-objpfx)libc.a $(otherlibs) $(gnulib-tests) $(common-objpfx)libc.a $(gnulib-tests)
- endif
- endif
-
-@@ -513,8 +524,43 @@
-
- # The static libraries.
- link-libc-static = -Wl,--start-group $(common-objpfx)libc.a $(static-gnulib) -Wl,--end-group
-+link-libc-static-tests = -Wl,--start-group $(common-objpfx)libc.a $(static-gnulib-tests) -Wl,--end-group
- link-libc-bounded = $(common-objpfx)libc_b.a $(gnulib) $(common-objpfx)libc_b.a
-
-+# How to link against libgcc. Some libgcc functions, such as those
-+# for "long long" arithmetic or software floating point, can always be
-+# built without use of C library headers and do not have any global
-+# state so can safely be linked statically into any executable or
-+# shared library requiring them; these functions are in libgcc.a.
-+# Other functions, relating to exception handling, may require C
-+# library headers to build and it may not be safe to have more than
-+# one copy of them in a process; these functions are only in
-+# libgcc_s.so and libgcc_eh.a.
-+#
-+# To avoid circular dependencies when bootstrapping, it is desirable
-+# to avoid use of libgcc_s and libgcc_eh in building glibc. Where any
-+# glibc functionality (in particular, thread cancellation) requires
-+# exception handling, this is implemented through dlopen of libgcc_s
-+# to avoid unnecessary dependencies on libgcc_s by programs not using
-+# that functionality; executables built with glibc do not use
-+# exception handling other than through thread cancellation.
-+#
-+# Undefined references to functions from libgcc_eh or libgcc_s may
-+# arise for code built with -fexceptions. In the case of statically
-+# linked programs installed by glibc, unwinding will never actually
-+# occur at runtime and the use of elf/static-stubs.c to resolve these
-+# references is safe. In the case of statically linked test programs
-+# and test programs built with -fexceptions, unwinding may occur in
-+# some cases and it is preferable to link with libgcc_eh or libgcc_s
-+# so that the testing is as similar as possible to how programs will
-+# be built with the installed glibc.
-+#
-+# Some architectures have architecture-specific systems for exception
-+# handling that may involve undefined references to
-+# architecture-specific functions. On those architectures,
-+# gnulib-arch and static-gnulib-arch may be defined in sysdeps
-+# makefiles to use additional libraries for linking executables and
-+# shared libraries built by glibc.
- ifndef gnulib
- ifneq ($(have-cc-with-libunwind),yes)
- libunwind =
-@@ -522,8 +568,12 @@
- libunwind = -lunwind
- endif
- libgcc_eh := -Wl,--as-needed -lgcc_s $(libunwind) -Wl,--no-as-needed
--gnulib := -lgcc $(libgcc_eh)
--static-gnulib := -lgcc -lgcc_eh $(libunwind)
-+gnulib-arch =
-+gnulib = -lgcc $(gnulib-arch)
-+gnulib-tests := -lgcc $(libgcc_eh)
-+static-gnulib-arch =
-+static-gnulib = -lgcc $(static-gnulib-arch)
-+static-gnulib-tests := -lgcc -lgcc_eh $(libunwind)
- libc.so-gnulib := -lgcc
- endif
- +preinit = $(addprefix $(csu-objpfx),crti.o)
-Index: a/libc/Rules
-===================================================================
---- a/libc/Rules 2012-07-04 18:25:47.000000000 -0700
-+++ b/libc/Rules 2012-08-14 20:16:10.197093639 -0700
-@@ -1,5 +1,4 @@
--# Copyright (C) 1991-2000,2002,2003,2004,2005,2006,2011
--# Free Software Foundation, Inc.
-+# Copyright (C) 1991-2012 Free Software Foundation, Inc.
- # This file is part of the GNU C Library.
-
- # The GNU C Library is free software; you can redistribute it and/or
-@@ -103,29 +102,46 @@
- # eglibc: endif
-
- ifeq ($(build-programs),yes)
--binaries-all = $(others) $(sysdep-others) $(tests) $(xtests) $(test-srcs)
--binaries-static = $(others-static) $(tests-static) $(xtests-static)
-+binaries-all-notests = $(others) $(sysdep-others)
-+binaries-all-tests = $(tests) $(xtests) $(test-srcs)
-+binaries-all = $(binaries-all-notests) $(binaries-all-tests)
-+binaries-static-notests = $(others-static)
-+binaries-static-tests = $(tests-static) $(xtests-static)
-+binaries-static = $(binaries-static-notests) $(binaries-static-tests)
- ifeq (yesyes,$(have-fpie)$(build-shared))
- binaries-pie = $(others-pie) $(tests-pie) $(xtests-pie)
- else
- binaries-pie =
- endif
- else
--binaries-all = $(tests) $(xtests) $(test-srcs)
-+binaries-all-notests =
-+binaries-all-tests = $(tests) $(xtests) $(test-srcs)
-+binaries-all = $(binaries-all-tests)
-+binaries-static-notests =
-+binaries-static-tests =
- binaries-static =
- binaries-pie =
- endif
-
--binaries-shared = $(filter-out $(binaries-pie) $(binaries-static), \
-- $(binaries-all))
-+binaries-shared-tests = $(filter-out $(binaries-pie) $(binaries-static), \
-+ $(binaries-all-tests))
-+binaries-shared-notests = $(filter-out $(binaries-pie) $(binaries-static), \
-+ $(binaries-all-notests))
-
--ifneq "$(strip $(binaries-shared))" ""
--$(addprefix $(objpfx),$(binaries-shared)): %: %.o \
-+ifneq "$(strip $(binaries-shared-notests))" ""
-+$(addprefix $(objpfx),$(binaries-shared-notests)): %: %.o \
- $(sort $(filter $(common-objpfx)lib%,$(link-libc))) \
- $(addprefix $(csu-objpfx),start.o) $(+preinit) $(+postinit)
- $(+link)
- endif
-
-+ifneq "$(strip $(binaries-shared-tests))" ""
-+$(addprefix $(objpfx),$(binaries-shared-tests)): %: %.o \
-+ $(sort $(filter $(common-objpfx)lib%,$(link-libc))) \
-+ $(addprefix $(csu-objpfx),start.o) $(+preinit) $(+postinit)
-+ $(+link-tests)
-+endif
-+
- ifneq "$(strip $(binaries-pie))" ""
- $(addprefix $(objpfx),$(binaries-pie)): %: %.o \
- $(sort $(filter $(common-objpfx)lib%,$(link-libc))) \
-@@ -133,13 +149,20 @@
- $(+link-pie)
- endif
-
--ifneq "$(strip $(binaries-static))" ""
--$(addprefix $(objpfx),$(binaries-static)): %: %.o \
-+ifneq "$(strip $(binaries-static-notests))" ""
-+$(addprefix $(objpfx),$(binaries-static-notests)): %: %.o \
- $(sort $(filter $(common-objpfx)lib%,$(link-libc-static))) \
- $(addprefix $(csu-objpfx),start.o) $(+preinit) $(+postinit)
- $(+link-static)
- endif
-
-+ifneq "$(strip $(binaries-static-tests))" ""
-+$(addprefix $(objpfx),$(binaries-static-tests)): %: %.o \
-+ $(sort $(filter $(common-objpfx)lib%,$(link-libc-static-tests))) \
-+ $(addprefix $(csu-objpfx),start.o) $(+preinit) $(+postinit)
-+ $(+link-static-tests)
-+endif
-+
- ifeq ($(build-bounded),yes)
- binaries-bounded = $(addsuffix -bp,$(tests) $(xtests) $(test-srcs))
- $(addprefix $(objpfx),$(binaries-bounded)): %-bp: %.ob \
-Index: a/libc/elf/Makefile
-===================================================================
---- a/libc/elf/Makefile 2012-07-04 18:26:34.000000000 -0700
-+++ b/libc/elf/Makefile 2012-08-14 20:16:10.197093639 -0700
-@@ -71,6 +71,8 @@
- install-bin = sprof pldd
- others-static = sln
- install-rootsbin = sln
-+sln-modules := static-stubs
-+extra-objs += $(sln-modules:=.o)
-
- ifeq (yes,$(use-ldconfig))
- ifeq (yes,$(build-shared))
-@@ -78,7 +80,7 @@
- others += ldconfig
- install-rootsbin += ldconfig
-
--ldconfig-modules := cache readlib xmalloc xstrdup chroot_canon
-+ldconfig-modules := cache readlib xmalloc xstrdup chroot_canon static-stubs
- extra-objs += $(ldconfig-modules:=.o)
- endif
- endif
-@@ -417,6 +419,8 @@
-
- $(objpfx)sprof: $(libdl)
-
-+$(objpfx)sln: $(sln-modules:%=$(objpfx)%.o)
-+
- $(objpfx)ldconfig: $(ldconfig-modules:%=$(objpfx)%.o)
-
- $(objpfx)pldd: $(pldd-modules:%=$(objpfx)%.o)
-Index: a/libc/elf/static-stubs.c
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ a/libc/elf/static-stubs.c 2012-08-14 20:16:10.197093639 -0700
-@@ -0,0 +1,46 @@
-+/* Stub implementations of functions to link into statically linked
-+ programs without needing libgcc_eh.
-+ Copyright (C) 2012 Free Software Foundation, Inc.
-+ This file is part of the GNU C Library.
-+
-+ The GNU C Library is free software; you can redistribute it and/or
-+ modify it under the terms of the GNU Lesser General Public
-+ License as published by the Free Software Foundation; either
-+ version 2.1 of the License, or (at your option) any later version.
-+
-+ The GNU C Library 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
-+ Lesser General Public License for more details.
-+
-+ You should have received a copy of the GNU Lesser General Public
-+ License along with the GNU C Library; if not, see
-+ <http://www.gnu.org/licenses/>. */
-+
-+/* Avoid backtrace (and so _Unwind_Backtrace) dependencies from
-+ sysdeps/unix/sysv/linux/libc_fatal.c. */
-+#include <sysdeps/posix/libc_fatal.c>
-+
-+#include <stdlib.h>
-+#include <unwind.h>
-+
-+/* These programs do not use thread cancellation, so _Unwind_Resume
-+ and the personality routine are never actually called. */
-+
-+void
-+_Unwind_Resume (struct _Unwind_Exception *exc __attribute__ ((unused)))
-+{
-+ abort ();
-+}
-+
-+_Unwind_Reason_Code
-+__gcc_personality_v0 (int version __attribute__ ((unused)),
-+ _Unwind_Action actions __attribute__ ((unused)),
-+ _Unwind_Exception_Class exception_class
-+ __attribute__ ((unused)),
-+ struct _Unwind_Exception *ue_header
-+ __attribute__ ((unused)),
-+ struct _Unwind_Context *context __attribute__ ((unused)))
-+{
-+ abort ();
-+}
-Index: a/ports/sysdeps/arm/Makefile
-===================================================================
---- a/ports/sysdeps/arm/Makefile 2012-07-04 18:25:41.000000000 -0700
-+++ b/ports/sysdeps/arm/Makefile 2012-08-14 20:16:10.201093638 -0700
-@@ -1,8 +1,16 @@
-+gnulib-arch = $(elfobjdir)/libgcc-stubs.a
-+static-gnulib-arch = $(elfobjdir)/libgcc-stubs.a
-+
- ifeq ($(subdir),elf)
- sysdep-dl-routines += tlsdesc dl-tlsdesc
- sysdep_routines += aeabi_unwind_cpp_pr1 find_exidx tlsdesc dl-tlsdesc
- sysdep-rtld-routines += aeabi_unwind_cpp_pr1 tlsdesc dl-tlsdesc
- shared-only-routines += aeabi_unwind_cpp_pr1
-+
-+$(objpfx)libgcc-stubs.a: $(objpfx)aeabi_unwind_cpp_pr1.os
-+ $(build-extra-lib)
-+
-+lib-noranlib: $(objpfx)libgcc-stubs.a
- endif
-
- ifeq ($(subdir),csu)