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