summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexey Neyman <stilor@att.net>2022-02-10 01:02:35 (GMT)
committerAlexey Neyman <stilor@att.net>2022-02-11 08:47:51 (GMT)
commita4cff7a0612fccb0e32529a10e53a836fa12d634 (patch)
tree814a1d575a571f5077d7024bee06efc3c227a5ff
parent5a0be8b4ec0f1b7ff4fe30c8caaa5285b4f11ae4 (diff)
glibc-2.12.1: backport a fix for 2-pass build
Otherwise, it tries to link against libgcc_eh which is not available until the final compiler (or previously, the pass-2 compiler) is built. Signed-off-by: Alexey Neyman <stilor@att.net>
-rw-r--r--packages/glibc-ports/2.12.1/0009-do-not-use-libgcc_eh.patch31
-rw-r--r--packages/glibc/2.12.1/0050-do-not-use-libgcc_eh.patch292
2 files changed, 323 insertions, 0 deletions
diff --git a/packages/glibc-ports/2.12.1/0009-do-not-use-libgcc_eh.patch b/packages/glibc-ports/2.12.1/0009-do-not-use-libgcc_eh.patch
new file mode 100644
index 0000000..dc746c4
--- /dev/null
+++ b/packages/glibc-ports/2.12.1/0009-do-not-use-libgcc_eh.patch
@@ -0,0 +1,31 @@
+commit 95f5a9a866695da4e038aa4e6ccbbfd5d9cf63b7
+Author: Joseph Myers <joseph@codesourcery.com>
+Date: Tue Jul 3 19:14:59 2012 +0000
+
+ Avoid use of libgcc_s and libgcc_eh when building glibc.
+
+---
+ sysdeps/arm/eabi/Makefile | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+--- a/sysdeps/arm/eabi/Makefile
++++ b/sysdeps/arm/eabi/Makefile
+@@ -1,3 +1,6 @@
++gnulib-arch = $(elfobjdir)/libgcc-stubs.a
++static-gnulib-arch = $(elfobjdir)/libgcc-stubs.a
++
+ ifeq ($(subdir),csu)
+ aeabi_constants = aeabi_lcsts aeabi_sighandlers aeabi_math
+ aeabi_routines = aeabi_assert aeabi_localeconv aeabi_errno_addr \
+@@ -24,6 +27,11 @@
+ sysdep_routines += aeabi_unwind_cpp_pr1 find_exidx
+ shared-only-routines += aeabi_unwind_cpp_pr1
+ sysdep-rtld-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),math)
diff --git a/packages/glibc/2.12.1/0050-do-not-use-libgcc_eh.patch b/packages/glibc/2.12.1/0050-do-not-use-libgcc_eh.patch
new file mode 100644
index 0000000..08192b3
--- /dev/null
+++ b/packages/glibc/2.12.1/0050-do-not-use-libgcc_eh.patch
@@ -0,0 +1,292 @@
+commit 95f5a9a866695da4e038aa4e6ccbbfd5d9cf63b7
+Author: Joseph Myers <joseph@codesourcery.com>
+Date: Tue Jul 3 19:14:59 2012 +0000
+
+ Avoid use of libgcc_s and libgcc_eh when building glibc.
+
+---
+ Makeconfig | 69 ++++++++++++++++++++++++++++++++++++++++++++++-------
+ Rules | 39 +++++++++++++++++++++++------
+ elf/Makefile | 6 +++-
+ elf/static-stubs.c | 46 +++++++++++++++++++++++++++++++++++
+ 4 files changed, 142 insertions(+), 18 deletions(-)
+
+--- a/Makeconfig
++++ b/Makeconfig
+@@ -429,9 +429,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)) \
+@@ -440,7 +440,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
+@@ -457,7 +460,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) \
+@@ -465,7 +468,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
+@@ -490,10 +498,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
+ endif
+@@ -504,6 +514,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
+
+@@ -532,14 +543,50 @@
+ # The static libraries.
+ ifeq (yes,$(build-static))
+ link-libc-static = $(common-objpfx)libc.a $(static-gnulib) $(otherlibs) $(common-objpfx)libc.a
++link-libc-static-tests = $(common-objpfx)libc.a $(static-gnulib-tests) $(otherlibs) $(common-objpfx)libc.a
+ else
+ ifeq (yes,$(build-shared))
+ # We can try to link the programs with lib*_pic.a...
+ link-libc-static = $(static-gnulib) $(common-objpfx)libc_pic.a
++link-libc-static-tests = $(static-gnulib-tests) $(common-objpfx)libc_pic.a
+ endif
+ endif
+ 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 =
+@@ -551,8 +598,12 @@
+ else
+ libgcc_eh := -Wl,--as-needed -lgcc_s$(libgcc_s_suffix) $(libunwind) -Wl,--no-as-needed
+ endif
+-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
+ ifeq ($(elf),yes)
+--- a/Rules
++++ b/Rules
+@@ -104,29 +104,52 @@
+ 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)
+ 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 =
+ endif
+
+-binaries-shared = $(filter-out $(binaries-static), $(binaries-all))
++binaries-shared-tests = $(filter-out $(binaries-static), $(binaries-all-tests))
++binaries-shared-notests = $(filter-out $(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-static))" ""
+-$(addprefix $(objpfx),$(binaries-static)): %: %.o \
++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-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 \
+--- a/elf/Makefile
++++ b/elf/Makefile
+@@ -157,6 +157,8 @@
+ install-bin = sprof
+ others-static = sln
+ install-rootsbin = sln
++sln-modules := static-stubs
++extra-objs += $(sln-modules:=.o)
+
+ ifeq (yes,$(use-ldconfig))
+ ifeq (yes,$(build-shared))
+@@ -164,7 +166,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)
+
+ # To find xmalloc.c and xstrdup.c
+@@ -455,6 +457,8 @@
+
+ $(objpfx)sprof: $(libdl)
+
++$(objpfx)sln: $(sln-modules:%=$(objpfx)%.o)
++
+ $(objpfx)ldconfig: $(ldconfig-modules:%=$(objpfx)%.o)
+ SYSCONF-FLAGS := -D'SYSCONFDIR="$(sysconfdir)"'
+ CFLAGS-ldconfig.c = $(SYSCONF-FLAGS) -D'LIBDIR="$(libdir)"' \
+--- /dev/null
++++ b/elf/static-stubs.c
+@@ -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 ();
++}