patches/eglibc/2_16/001-Avoid-use-of-libgcc_s-and-libgcc_eh-when-building-gl.patch
author Jang, Bongseo <graycells@gmail.com>
Sun Sep 23 11:18:30 2012 +0900 (2012-09-23)
changeset 3058 2800ef0ff450
parent 3052 06b663f297ad
permissions -rw-r--r--
libc/eglibc: Split changeset 3052:06b663f297 into eglibc/libc and eglibc/ports patches

crosstool-ng's glibc patche is made against glibc/libc sub-dir.
changeset 3052:06b663f297 is against glibc top-dir. it needs to split.

Signed-off-by: "Jang, Bongseo" <graycells@gmail.com>
[yann.morin.1998@free.fr: fix the ports patches depth]
Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
Message-ID: <5040c8e83e35618361dc.1348370890@localhost.localdomain>
PatchWork-ID: 186177
f@3052
     1
Upstream-Status: Backport
f@3052
     2
Signed-off-by: Khem Raj <raj.khem@gmail.com>
f@3052
     3
f@3052
     4
From 95f5a9a866695da4e038aa4e6ccbbfd5d9cf63b7 Mon Sep 17 00:00:00 2001
f@3052
     5
From: Joseph Myers <joseph@codesourcery.com>
f@3052
     6
Date: Tue, 3 Jul 2012 19:14:59 +0000
f@3052
     7
Subject: [PATCH] Avoid use of libgcc_s and libgcc_eh when building glibc.
f@3052
     8
f@3052
     9
---
f@3052
    10
 ChangeLog                  |   47 ++++++++++++++++++++++++++++++
f@3052
    11
 Makeconfig                 |   68 ++++++++++++++++++++++++++++++++++++++------
f@3052
    12
 Rules                      |   45 ++++++++++++++++++++++-------
f@3052
    13
 elf/Makefile               |    6 +++-
f@3052
    14
 elf/static-stubs.c         |   46 ++++++++++++++++++++++++++++++
f@3052
    15
 ports/ChangeLog.arm        |    7 +++++
f@3052
    16
 ports/sysdeps/arm/Makefile |    8 ++++++
f@3052
    17
 7 files changed, 206 insertions(+), 21 deletions(-)
f@3052
    18
 create mode 100644 elf/static-stubs.c
f@3052
    19
graycells@3058
    20
Index: a/Makeconfig
f@3052
    21
===================================================================
graycells@3058
    22
--- a/Makeconfig	2012-07-04 18:26:22.000000000 -0700
graycells@3058
    23
+++ b/Makeconfig	2012-08-14 20:16:10.197093639 -0700
f@3052
    24
@@ -415,9 +415,9 @@
f@3052
    25
 LDFLAGS-rtld += $(hashstyle-LDFLAGS)
f@3052
    26
 endif
f@3052
    27
 
f@3052
    28
-# Command for linking programs with the C library.
f@3052
    29
+# Commands for linking programs with the C library.
f@3052
    30
 ifndef +link
f@3052
    31
-+link = $(CC) -nostdlib -nostartfiles -o $@ \
f@3052
    32
++link-before-libc = $(CC) -nostdlib -nostartfiles -o $@ \
f@3052
    33
 	      $(sysdep-LDFLAGS) $(config-LDFLAGS) $(LDFLAGS) $(LDFLAGS-$(@F)) \
f@3052
    34
 	      $(combreloc-LDFLAGS) $(relro-LDFLAGS) $(hashstyle-LDFLAGS) \
f@3052
    35
 	      $(addprefix $(csu-objpfx),$(start-installed-name)) \
f@3052
    36
@@ -426,7 +426,10 @@
f@3052
    37
 						     $(start-installed-name))\
f@3052
    38
 			   $(+preinit) $(link-extra-libs) \
f@3052
    39
 			   $(common-objpfx)libc% $(+postinit),$^) \
f@3052
    40
-	      $(link-extra-libs) $(link-libc) $(+postctor) $(+postinit)
f@3052
    41
+	      $(link-extra-libs)
f@3052
    42
++link-after-libc = $(+postctor) $(+postinit)
f@3052
    43
++link = $(+link-before-libc) $(link-libc) $(+link-after-libc)
f@3052
    44
++link-tests = $(+link-before-libc) $(link-libc-tests) $(+link-after-libc)
f@3052
    45
 endif
f@3052
    46
 # Command for linking PIE programs with the C library.
f@3052
    47
 ifndef +link-pie
f@3052
    48
@@ -443,7 +446,7 @@
f@3052
    49
 endif
f@3052
    50
 # Command for statically linking programs with the C library.
f@3052
    51
 ifndef +link-static
f@3052
    52
-+link-static = $(CC) -nostdlib -nostartfiles -static -o $@ \
f@3052
    53
++link-static-before-libc = $(CC) -nostdlib -nostartfiles -static -o $@ \
f@3052
    54
 	      $(sysdep-LDFLAGS) $(LDFLAGS) $(LDFLAGS-$(@F))  \
f@3052
    55
 	      $(addprefix $(csu-objpfx),$(static-start-installed-name)) \
f@3052
    56
 	      $(+preinit) $(+prector) \
f@3052
    57
@@ -451,7 +454,12 @@
f@3052
    58
 						     $(start-installed-name))\
f@3052
    59
 			   $(+preinit) $(link-extra-libs-static) \
f@3052
    60
 			   $(common-objpfx)libc% $(+postinit),$^) \
f@3052
    61
-	      $(link-extra-libs-static) $(link-libc-static) $(+postctor) $(+postinit)
f@3052
    62
+	      $(link-extra-libs-static) $(link-libc-static)
f@3052
    63
++link-static-after-libc = $(+postctor) $(+postinit)
f@3052
    64
++link-static = $(+link-static-before-libc) $(link-libc-static) \
f@3052
    65
+	       $(+link-static-after-libc)
f@3052
    66
++link-static-tests = $(+link-static-before-libc) $(link-libc-static-tests) \
f@3052
    67
+		     $(+link-static-after-libc)
f@3052
    68
 endif
f@3052
    69
 # Command for statically linking bounded-pointer programs with the C library.
f@3052
    70
 ifndef +link-bounded
f@3052
    71
@@ -475,10 +483,12 @@
f@3052
    72
 # We need the versioned name of libc.so in the deps of $(others) et al
f@3052
    73
 # so that the symlink to libc.so is created before anything tries to
f@3052
    74
 # run the linked programs.
f@3052
    75
-link-libc = -Wl,-rpath-link=$(rpath-link) \
f@3052
    76
+link-libc-before-gnulib = -Wl,-rpath-link=$(rpath-link) \
f@3052
    77
 	    $(common-objpfx)libc.so$(libc.so-version) \
f@3052
    78
 	    $(common-objpfx)$(patsubst %,$(libtype.oS),c) \
f@3052
    79
-	    $(as-needed) $(common-objpfx)elf/ld.so $(no-as-needed) $(gnulib)
f@3052
    80
+	    $(as-needed) $(common-objpfx)elf/ld.so $(no-as-needed)
f@3052
    81
+link-libc = $(link-libc-before-gnulib) $(gnulib)
f@3052
    82
+link-libc-tests = $(link-libc-before-gnulib) $(gnulib-tests)
f@3052
    83
 # This is how to find at build-time things that will be installed there.
f@3052
    84
 rpath-dirs = math elf dlfcn nss nis rt resolv crypt
f@3052
    85
 rpath-link = \
f@3052
    86
@@ -488,6 +498,7 @@
f@3052
    87
 nssobjdir := $(patsubst ../$(subdir),.,$(common-objpfx)nss)
f@3052
    88
 resolvobjdir := $(patsubst ../$(subdir),.,$(common-objpfx)resolv)
f@3052
    89
 link-libc = $(common-objpfx)libc.a $(otherlibs) $(gnulib) $(common-objpfx)libc.a $(gnulib)
f@3052
    90
+link-libc-tests = $(common-objpfx)libc.a $(otherlibs) $(gnulib-tests) $(common-objpfx)libc.a $(gnulib-tests)
f@3052
    91
 endif
f@3052
    92
 endif
f@3052
    93
 
f@3052
    94
@@ -513,8 +524,43 @@
f@3052
    95
 
f@3052
    96
 # The static libraries.
f@3052
    97
 link-libc-static = -Wl,--start-group $(common-objpfx)libc.a $(static-gnulib) -Wl,--end-group
f@3052
    98
+link-libc-static-tests = -Wl,--start-group $(common-objpfx)libc.a $(static-gnulib-tests) -Wl,--end-group
f@3052
    99
 link-libc-bounded = $(common-objpfx)libc_b.a $(gnulib) $(common-objpfx)libc_b.a
f@3052
   100
 
f@3052
   101
+# How to link against libgcc.  Some libgcc functions, such as those
f@3052
   102
+# for "long long" arithmetic or software floating point, can always be
f@3052
   103
+# built without use of C library headers and do not have any global
f@3052
   104
+# state so can safely be linked statically into any executable or
f@3052
   105
+# shared library requiring them; these functions are in libgcc.a.
f@3052
   106
+# Other functions, relating to exception handling, may require C
f@3052
   107
+# library headers to build and it may not be safe to have more than
f@3052
   108
+# one copy of them in a process; these functions are only in
f@3052
   109
+# libgcc_s.so and libgcc_eh.a.
f@3052
   110
+#
f@3052
   111
+# To avoid circular dependencies when bootstrapping, it is desirable
f@3052
   112
+# to avoid use of libgcc_s and libgcc_eh in building glibc.  Where any
f@3052
   113
+# glibc functionality (in particular, thread cancellation) requires
f@3052
   114
+# exception handling, this is implemented through dlopen of libgcc_s
f@3052
   115
+# to avoid unnecessary dependencies on libgcc_s by programs not using
f@3052
   116
+# that functionality; executables built with glibc do not use
f@3052
   117
+# exception handling other than through thread cancellation.
f@3052
   118
+#
f@3052
   119
+# Undefined references to functions from libgcc_eh or libgcc_s may
f@3052
   120
+# arise for code built with -fexceptions.  In the case of statically
f@3052
   121
+# linked programs installed by glibc, unwinding will never actually
f@3052
   122
+# occur at runtime and the use of elf/static-stubs.c to resolve these
f@3052
   123
+# references is safe.  In the case of statically linked test programs
f@3052
   124
+# and test programs built with -fexceptions, unwinding may occur in
f@3052
   125
+# some cases and it is preferable to link with libgcc_eh or libgcc_s
f@3052
   126
+# so that the testing is as similar as possible to how programs will
f@3052
   127
+# be built with the installed glibc.
f@3052
   128
+#
f@3052
   129
+# Some architectures have architecture-specific systems for exception
f@3052
   130
+# handling that may involve undefined references to
f@3052
   131
+# architecture-specific functions.  On those architectures,
f@3052
   132
+# gnulib-arch and static-gnulib-arch may be defined in sysdeps
f@3052
   133
+# makefiles to use additional libraries for linking executables and
f@3052
   134
+# shared libraries built by glibc.
f@3052
   135
 ifndef gnulib
f@3052
   136
 ifneq ($(have-cc-with-libunwind),yes)
f@3052
   137
   libunwind =
f@3052
   138
@@ -522,8 +568,12 @@
f@3052
   139
   libunwind = -lunwind
f@3052
   140
 endif
f@3052
   141
 libgcc_eh := -Wl,--as-needed -lgcc_s $(libunwind) -Wl,--no-as-needed
f@3052
   142
-gnulib := -lgcc $(libgcc_eh)
f@3052
   143
-static-gnulib := -lgcc -lgcc_eh $(libunwind)
f@3052
   144
+gnulib-arch =
f@3052
   145
+gnulib = -lgcc $(gnulib-arch)
f@3052
   146
+gnulib-tests := -lgcc $(libgcc_eh)
f@3052
   147
+static-gnulib-arch =
f@3052
   148
+static-gnulib = -lgcc $(static-gnulib-arch)
f@3052
   149
+static-gnulib-tests := -lgcc -lgcc_eh $(libunwind)
f@3052
   150
 libc.so-gnulib := -lgcc
f@3052
   151
 endif
f@3052
   152
 +preinit = $(addprefix $(csu-objpfx),crti.o)
graycells@3058
   153
Index: a/Rules
f@3052
   154
===================================================================
graycells@3058
   155
--- a/Rules	2012-07-04 18:25:47.000000000 -0700
graycells@3058
   156
+++ b/Rules	2012-08-14 20:16:10.197093639 -0700
f@3052
   157
@@ -1,5 +1,4 @@
f@3052
   158
-# Copyright (C) 1991-2000,2002,2003,2004,2005,2006,2011
f@3052
   159
-#	Free Software Foundation, Inc.
f@3052
   160
+# Copyright (C) 1991-2012 Free Software Foundation, Inc.
f@3052
   161
 # This file is part of the GNU C Library.
f@3052
   162
 
f@3052
   163
 # The GNU C Library is free software; you can redistribute it and/or
f@3052
   164
@@ -103,29 +102,46 @@
f@3052
   165
 # eglibc: endif
f@3052
   166
 
f@3052
   167
 ifeq ($(build-programs),yes)
f@3052
   168
-binaries-all = $(others) $(sysdep-others) $(tests) $(xtests) $(test-srcs)
f@3052
   169
-binaries-static = $(others-static) $(tests-static) $(xtests-static)
f@3052
   170
+binaries-all-notests = $(others) $(sysdep-others)
f@3052
   171
+binaries-all-tests = $(tests) $(xtests) $(test-srcs)
f@3052
   172
+binaries-all = $(binaries-all-notests) $(binaries-all-tests)
f@3052
   173
+binaries-static-notests = $(others-static)
f@3052
   174
+binaries-static-tests = $(tests-static) $(xtests-static)
f@3052
   175
+binaries-static = $(binaries-static-notests) $(binaries-static-tests)
f@3052
   176
 ifeq (yesyes,$(have-fpie)$(build-shared))
f@3052
   177
 binaries-pie = $(others-pie) $(tests-pie) $(xtests-pie)
f@3052
   178
 else
f@3052
   179
 binaries-pie =
f@3052
   180
 endif
f@3052
   181
 else
f@3052
   182
-binaries-all = $(tests) $(xtests) $(test-srcs)
f@3052
   183
+binaries-all-notests =
f@3052
   184
+binaries-all-tests = $(tests) $(xtests) $(test-srcs)
f@3052
   185
+binaries-all = $(binaries-all-tests)
f@3052
   186
+binaries-static-notests =
f@3052
   187
+binaries-static-tests =
f@3052
   188
 binaries-static =
f@3052
   189
 binaries-pie =
f@3052
   190
 endif
f@3052
   191
 
f@3052
   192
-binaries-shared = $(filter-out $(binaries-pie) $(binaries-static), \
f@3052
   193
-			       $(binaries-all))
f@3052
   194
+binaries-shared-tests = $(filter-out $(binaries-pie) $(binaries-static), \
f@3052
   195
+				     $(binaries-all-tests))
f@3052
   196
+binaries-shared-notests = $(filter-out $(binaries-pie) $(binaries-static), \
f@3052
   197
+				       $(binaries-all-notests))
f@3052
   198
 
f@3052
   199
-ifneq "$(strip $(binaries-shared))" ""
f@3052
   200
-$(addprefix $(objpfx),$(binaries-shared)): %: %.o \
f@3052
   201
+ifneq "$(strip $(binaries-shared-notests))" ""
f@3052
   202
+$(addprefix $(objpfx),$(binaries-shared-notests)): %: %.o \
f@3052
   203
   $(sort $(filter $(common-objpfx)lib%,$(link-libc))) \
f@3052
   204
   $(addprefix $(csu-objpfx),start.o) $(+preinit) $(+postinit)
f@3052
   205
 	$(+link)
f@3052
   206
 endif
f@3052
   207
 
f@3052
   208
+ifneq "$(strip $(binaries-shared-tests))" ""
f@3052
   209
+$(addprefix $(objpfx),$(binaries-shared-tests)): %: %.o \
f@3052
   210
+  $(sort $(filter $(common-objpfx)lib%,$(link-libc))) \
f@3052
   211
+  $(addprefix $(csu-objpfx),start.o) $(+preinit) $(+postinit)
f@3052
   212
+	$(+link-tests)
f@3052
   213
+endif
f@3052
   214
+
f@3052
   215
 ifneq "$(strip $(binaries-pie))" ""
f@3052
   216
 $(addprefix $(objpfx),$(binaries-pie)): %: %.o \
f@3052
   217
   $(sort $(filter $(common-objpfx)lib%,$(link-libc))) \
f@3052
   218
@@ -133,13 +149,20 @@
f@3052
   219
 	$(+link-pie)
f@3052
   220
 endif
f@3052
   221
 
f@3052
   222
-ifneq "$(strip $(binaries-static))" ""
f@3052
   223
-$(addprefix $(objpfx),$(binaries-static)): %: %.o \
f@3052
   224
+ifneq "$(strip $(binaries-static-notests))" ""
f@3052
   225
+$(addprefix $(objpfx),$(binaries-static-notests)): %: %.o \
f@3052
   226
   $(sort $(filter $(common-objpfx)lib%,$(link-libc-static))) \
f@3052
   227
   $(addprefix $(csu-objpfx),start.o) $(+preinit) $(+postinit)
f@3052
   228
 	$(+link-static)
f@3052
   229
 endif
f@3052
   230
 
f@3052
   231
+ifneq "$(strip $(binaries-static-tests))" ""
f@3052
   232
+$(addprefix $(objpfx),$(binaries-static-tests)): %: %.o \
f@3052
   233
+  $(sort $(filter $(common-objpfx)lib%,$(link-libc-static-tests))) \
f@3052
   234
+  $(addprefix $(csu-objpfx),start.o) $(+preinit) $(+postinit)
f@3052
   235
+	$(+link-static-tests)
f@3052
   236
+endif
f@3052
   237
+
f@3052
   238
 ifeq ($(build-bounded),yes)
f@3052
   239
 binaries-bounded = $(addsuffix -bp,$(tests) $(xtests) $(test-srcs))
f@3052
   240
 $(addprefix $(objpfx),$(binaries-bounded)): %-bp: %.ob \
graycells@3058
   241
Index: a/elf/Makefile
f@3052
   242
===================================================================
graycells@3058
   243
--- a/elf/Makefile	2012-07-04 18:26:34.000000000 -0700
graycells@3058
   244
+++ b/elf/Makefile	2012-08-14 20:16:10.197093639 -0700
f@3052
   245
@@ -71,6 +71,8 @@
f@3052
   246
 install-bin	= sprof pldd
f@3052
   247
 others-static   = sln
f@3052
   248
 install-rootsbin = sln
f@3052
   249
+sln-modules	:= static-stubs
f@3052
   250
+extra-objs	+= $(sln-modules:=.o)
f@3052
   251
 
f@3052
   252
 ifeq (yes,$(use-ldconfig))
f@3052
   253
 ifeq (yes,$(build-shared))
f@3052
   254
@@ -78,7 +80,7 @@
f@3052
   255
 others		+= ldconfig
f@3052
   256
 install-rootsbin += ldconfig
f@3052
   257
 
f@3052
   258
-ldconfig-modules := cache readlib xmalloc xstrdup chroot_canon
f@3052
   259
+ldconfig-modules := cache readlib xmalloc xstrdup chroot_canon static-stubs
f@3052
   260
 extra-objs	+= $(ldconfig-modules:=.o)
f@3052
   261
 endif
f@3052
   262
 endif
f@3052
   263
@@ -417,6 +419,8 @@
f@3052
   264
 
f@3052
   265
 $(objpfx)sprof: $(libdl)
f@3052
   266
 
f@3052
   267
+$(objpfx)sln: $(sln-modules:%=$(objpfx)%.o)
f@3052
   268
+
f@3052
   269
 $(objpfx)ldconfig: $(ldconfig-modules:%=$(objpfx)%.o)
f@3052
   270
 
f@3052
   271
 $(objpfx)pldd: $(pldd-modules:%=$(objpfx)%.o)
graycells@3058
   272
Index: a/elf/static-stubs.c
f@3052
   273
===================================================================
f@3052
   274
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
graycells@3058
   275
+++ a/elf/static-stubs.c	2012-08-14 20:16:10.197093639 -0700
f@3052
   276
@@ -0,0 +1,46 @@
f@3052
   277
+/* Stub implementations of functions to link into statically linked
f@3052
   278
+   programs without needing libgcc_eh.
f@3052
   279
+   Copyright (C) 2012 Free Software Foundation, Inc.
f@3052
   280
+   This file is part of the GNU C Library.
f@3052
   281
+
f@3052
   282
+   The GNU C Library is free software; you can redistribute it and/or
f@3052
   283
+   modify it under the terms of the GNU Lesser General Public
f@3052
   284
+   License as published by the Free Software Foundation; either
f@3052
   285
+   version 2.1 of the License, or (at your option) any later version.
f@3052
   286
+
f@3052
   287
+   The GNU C Library is distributed in the hope that it will be useful,
f@3052
   288
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
f@3052
   289
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
f@3052
   290
+   Lesser General Public License for more details.
f@3052
   291
+
f@3052
   292
+   You should have received a copy of the GNU Lesser General Public
f@3052
   293
+   License along with the GNU C Library; if not, see
f@3052
   294
+   <http://www.gnu.org/licenses/>.  */
f@3052
   295
+
f@3052
   296
+/* Avoid backtrace (and so _Unwind_Backtrace) dependencies from
f@3052
   297
+   sysdeps/unix/sysv/linux/libc_fatal.c.  */
f@3052
   298
+#include <sysdeps/posix/libc_fatal.c>
f@3052
   299
+
f@3052
   300
+#include <stdlib.h>
f@3052
   301
+#include <unwind.h>
f@3052
   302
+
f@3052
   303
+/* These programs do not use thread cancellation, so _Unwind_Resume
f@3052
   304
+   and the personality routine are never actually called.  */
f@3052
   305
+
f@3052
   306
+void
f@3052
   307
+_Unwind_Resume (struct _Unwind_Exception *exc __attribute__ ((unused)))
f@3052
   308
+{
f@3052
   309
+  abort ();
f@3052
   310
+}
f@3052
   311
+
f@3052
   312
+_Unwind_Reason_Code
f@3052
   313
+__gcc_personality_v0 (int version __attribute__ ((unused)),
f@3052
   314
+		      _Unwind_Action actions __attribute__ ((unused)),
f@3052
   315
+		      _Unwind_Exception_Class exception_class
f@3052
   316
+		      __attribute__ ((unused)),
f@3052
   317
+		      struct _Unwind_Exception *ue_header
f@3052
   318
+		      __attribute__ ((unused)),
f@3052
   319
+		      struct _Unwind_Context *context __attribute__ ((unused)))
f@3052
   320
+{
f@3052
   321
+  abort ();
f@3052
   322
+}