glibc: dont link libgcc_eh.a pre 2.17, and backport at_random auxval patch (#40013)
This resolves an interesting circular dependency between gcc and glibc: 1. glibc < 2.17 depends on libgcc.a and libgcc_eh.a 2. libgcc_eh.a is only built when gcc is configured with --enable-shared 3. but building shared libraries requires crt*.o and libc.so Backport AT_RANDOM auxval changes to avoid dealing with wrong inline assembly (fallback code fails on ubuntu 23.04)
This commit is contained in:
		
							
								
								
									
										194
									
								
								var/spack/repos/builtin/packages/glibc/95f5a9a-2.11.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										194
									
								
								var/spack/repos/builtin/packages/glibc/95f5a9a-2.11.patch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,194 @@ | |||||||
|  | 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. | ||||||
|  |  | ||||||
|  | diff --git a/Makeconfig b/Makeconfig | ||||||
|  | index 47638b13c6..6384e22a72 100644 | ||||||
|  | --- a/Makeconfig | ||||||
|  | +++ b/Makeconfig | ||||||
|  | @@ -423,7 +423,7 @@ endif | ||||||
|  |   | ||||||
|  |  # Command 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)) \ | ||||||
|  | @@ -432,7 +432,10 @@ ifndef +link | ||||||
|  |  						     $(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 | ||||||
|  | @@ -449,7 +452,7 @@ ifndef +link-pie | ||||||
|  |  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) \ | ||||||
|  | @@ -457,7 +460,12 @@ ifndef +link-static | ||||||
|  |  						     $(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 | ||||||
|  | @@ -482,9 +490,11 @@ ifeq ($(elf),yes) | ||||||
|  |  # 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) $(gnulib) | ||||||
|  | +	    $(common-objpfx)$(patsubst %,$(libtype.oS),c) | ||||||
|  | +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 | ||||||
|  | @@ -495,6 +505,7 @@ else | ||||||
|  |  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 | ||||||
|  |   | ||||||
|  | @@ -523,6 +534,7 @@ endif | ||||||
|  |  # The static libraries. | ||||||
|  |  ifeq (yes,$(build-static)) | ||||||
|  |  link-libc-static = $(common-objpfx)libc.a $(static-gnulib) $(common-objpfx)libc.a | ||||||
|  | +link-libc-static-tests = $(common-objpfx)libc.a $(static-gnulib-tests) $(common-objpfx)libc.a | ||||||
|  |  else | ||||||
|  |  ifeq (yes,$(build-shared)) | ||||||
|  |  # We can try to link the programs with lib*_pic.a... | ||||||
|  | @@ -542,8 +554,12 @@ ifneq ($(have-as-needed),yes) | ||||||
|  |  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) | ||||||
|  | diff --git a/Rules b/Rules | ||||||
|  | index 5ace24cee0..45eb7541dc 100644 | ||||||
|  | --- a/Rules | ||||||
|  | +++ b/Rules | ||||||
|  | @@ -104,29 +104,52 @@ xtests: tests $(xtests:%=$(objpfx)%.out) $(xtests-bp.out) | ||||||
|  |  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 \ | ||||||
|  | diff --git a/elf/Makefile b/elf/Makefile | ||||||
|  | index 34609a0f85..84709920e8 100644 | ||||||
|  | --- a/elf/Makefile | ||||||
|  | +++ b/elf/Makefile | ||||||
|  | @@ -150,6 +150,8 @@ others		= sprof sln | ||||||
|  |  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)) | ||||||
|  | @@ -157,7 +159,7 @@ others-static	+= ldconfig | ||||||
|  |  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 | ||||||
|  | @@ -448,6 +450,8 @@ $(objpfx)ldd: ldd.bash.in $(common-objpfx)soversions.mk \ | ||||||
|  |   | ||||||
|  |  $(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)"' \ | ||||||
							
								
								
									
										195
									
								
								var/spack/repos/builtin/packages/glibc/95f5a9a-2.13.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										195
									
								
								var/spack/repos/builtin/packages/glibc/95f5a9a-2.13.patch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,195 @@ | |||||||
|  | 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. | ||||||
|  |  | ||||||
|  | diff --git a/Makeconfig b/Makeconfig | ||||||
|  | index e5cbf646fa..870a4bec4f 100644 | ||||||
|  | --- a/Makeconfig | ||||||
|  | +++ b/Makeconfig | ||||||
|  | @@ -431,7 +431,7 @@ endif | ||||||
|  |   | ||||||
|  |  # Command 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 @@ ifndef +link | ||||||
|  |  						     $(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 @@ ifndef +link-pie | ||||||
|  |  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 @@ ifndef +link-static | ||||||
|  |  						     $(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 @@ ifeq ($(elf),yes) | ||||||
|  |  # 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 @@ else | ||||||
|  |  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,6 +543,7 @@ endif | ||||||
|  |  # The static libraries. | ||||||
|  |  ifeq (yes,$(build-static)) | ||||||
|  |  link-libc-static = $(common-objpfx)libc.a $(static-gnulib) $(common-objpfx)libc.a | ||||||
|  | +link-libc-static-tests = $(common-objpfx)libc.a $(static-gnulib-tests) $(common-objpfx)libc.a | ||||||
|  |  else | ||||||
|  |  ifeq (yes,$(build-shared)) | ||||||
|  |  # We can try to link the programs with lib*_pic.a... | ||||||
|  | @@ -551,8 +563,12 @@ ifneq ($(have-as-needed),yes) | ||||||
|  |  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) | ||||||
|  | diff --git a/Rules b/Rules | ||||||
|  | index 5ace24cee0..45eb7541dc 100644 | ||||||
|  | --- a/Rules | ||||||
|  | +++ b/Rules | ||||||
|  | @@ -104,29 +104,52 @@ xtests: tests $(xtests:%=$(objpfx)%.out) $(xtests-bp.out) | ||||||
|  |  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 \ | ||||||
|  | diff --git a/elf/Makefile b/elf/Makefile | ||||||
|  | index 2d2d568013..fe1924ebd4 100644 | ||||||
|  | --- a/elf/Makefile | ||||||
|  | +++ b/elf/Makefile | ||||||
|  | @@ -150,6 +150,8 @@ others		= sprof sln | ||||||
|  |  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)) | ||||||
|  | @@ -157,7 +159,7 @@ others-static	+= ldconfig | ||||||
|  |  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 | ||||||
|  | @@ -458,6 +460,8 @@ $(objpfx)ldd: ldd.bash.in $(common-objpfx)soversions.mk \ | ||||||
|  |   | ||||||
|  |  $(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)"' \ | ||||||
							
								
								
									
										211
									
								
								var/spack/repos/builtin/packages/glibc/95f5a9a-2.15.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										211
									
								
								var/spack/repos/builtin/packages/glibc/95f5a9a-2.15.patch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,211 @@ | |||||||
|  | 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. | ||||||
|  |  | ||||||
|  | diff --git a/Makeconfig b/Makeconfig | ||||||
|  | index 8195245052..b23cee8723 100644 | ||||||
|  | --- a/Makeconfig | ||||||
|  | +++ b/Makeconfig | ||||||
|  | @@ -447,7 +447,7 @@ endif | ||||||
|  |   | ||||||
|  |  # Command 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)) \ | ||||||
|  | @@ -456,7 +456,10 @@ ifndef +link | ||||||
|  |  						     $(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 | ||||||
|  | @@ -473,7 +476,7 @@ ifndef +link-pie | ||||||
|  |  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) \ | ||||||
|  | @@ -481,7 +484,12 @@ ifndef +link-static | ||||||
|  |  						     $(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 | ||||||
|  | @@ -506,10 +514,12 @@ ifeq ($(elf),yes) | ||||||
|  |  # 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 | ||||||
|  | @@ -520,6 +530,7 @@ else | ||||||
|  |  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 | ||||||
|  |   | ||||||
|  | @@ -548,6 +559,7 @@ endif | ||||||
|  |  # The static libraries. | ||||||
|  |  ifeq (yes,$(build-static)) | ||||||
|  |  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 | ||||||
|  |  else | ||||||
|  |  ifeq (yes,$(build-shared)) | ||||||
|  |  # We can try to link the programs with lib*_pic.a... | ||||||
|  | @@ -567,8 +579,12 @@ ifneq ($(have-as-needed),yes) | ||||||
|  |  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) | ||||||
|  | diff --git a/Rules b/Rules | ||||||
|  | index 00f03df6da..4a31d2905c 100644 | ||||||
|  | --- a/Rules | ||||||
|  | +++ b/Rules | ||||||
|  | @@ -104,29 +104,46 @@ xtests: tests $(xtests:%=$(objpfx)%.out) $(xtests-bp.out) | ||||||
|  |  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))) \ | ||||||
|  | @@ -134,13 +151,20 @@ $(addprefix $(objpfx),$(binaries-pie)): %: %.o \ | ||||||
|  |  	$(+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 \ | ||||||
|  | diff --git a/elf/Makefile b/elf/Makefile | ||||||
|  | index f20f52dee1..64555b9243 100644 | ||||||
|  | --- a/elf/Makefile | ||||||
|  | +++ b/elf/Makefile | ||||||
|  | @@ -156,6 +156,8 @@ others		= sprof sln pldd | ||||||
|  |  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)) | ||||||
|  | @@ -163,7 +165,7 @@ others-static	+= ldconfig | ||||||
|  |  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) | ||||||
|  |   | ||||||
|  |  pldd-modules := xmalloc | ||||||
|  | @@ -495,6 +497,8 @@ $(objpfx)ldd: ldd.bash.in $(common-objpfx)soversions.mk \ | ||||||
|  |   | ||||||
|  |  $(objpfx)sprof: $(libdl) | ||||||
|  |   | ||||||
|  | +$(objpfx)sln: $(sln-modules:%=$(objpfx)%.o) | ||||||
|  | + | ||||||
|  |  $(objpfx)ldconfig: $(ldconfig-modules:%=$(objpfx)%.o) | ||||||
|  |   | ||||||
|  |  $(objpfx)pldd: $(pldd-modules:%=$(objpfx)%.o) | ||||||
							
								
								
									
										214
									
								
								var/spack/repos/builtin/packages/glibc/95f5a9a-2.16.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										214
									
								
								var/spack/repos/builtin/packages/glibc/95f5a9a-2.16.patch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,214 @@ | |||||||
|  | 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. | ||||||
|  |  | ||||||
|  | diff --git a/Makeconfig b/Makeconfig | ||||||
|  | index 417fa508a6..c860e68cdd 100644 | ||||||
|  | --- a/Makeconfig | ||||||
|  | +++ b/Makeconfig | ||||||
|  | @@ -415,9 +415,9 @@ LDFLAGS.so += $(hashstyle-LDFLAGS) | ||||||
|  |  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 @@ ifndef +link | ||||||
|  |  						     $(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 @@ ifndef +link-pie | ||||||
|  |  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 @@ ifndef +link-static | ||||||
|  |  						     $(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 @@ ifeq (yes,$(build-shared)) | ||||||
|  |  # 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 @@ else | ||||||
|  |  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,6 +524,7 @@ endif | ||||||
|  |   | ||||||
|  |  # 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 | ||||||
|  |   | ||||||
|  |  ifndef gnulib | ||||||
|  | @@ -522,8 +534,12 @@ else | ||||||
|  |    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) | ||||||
|  | diff --git a/Rules b/Rules | ||||||
|  | index 3c61a2933b..be3a738574 100644 | ||||||
|  | --- a/Rules | ||||||
|  | +++ b/Rules | ||||||
|  | @@ -103,29 +103,46 @@ xtests: tests $(xtests:%=$(objpfx)%.out) $(xtests-bp.out) | ||||||
|  |  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 +150,20 @@ $(addprefix $(objpfx),$(binaries-pie)): %: %.o \ | ||||||
|  |  	$(+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 \ | ||||||
|  | diff --git a/elf/Makefile b/elf/Makefile | ||||||
|  | index 0c26ce545a..90541991d2 100644 | ||||||
|  | --- a/elf/Makefile | ||||||
|  | +++ b/elf/Makefile | ||||||
|  | @@ -71,6 +71,8 @@ others		= sprof sln pldd | ||||||
|  |  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-static	+= ldconfig | ||||||
|  |  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 | ||||||
|  | @@ -411,6 +413,8 @@ $(objpfx)ldd: ldd.bash.in $(common-objpfx)soversions.mk \ | ||||||
|  |   | ||||||
|  |  $(objpfx)sprof: $(libdl) | ||||||
|  |   | ||||||
|  | +$(objpfx)sln: $(sln-modules:%=$(objpfx)%.o) | ||||||
|  | + | ||||||
|  |  $(objpfx)ldconfig: $(ldconfig-modules:%=$(objpfx)%.o) | ||||||
|  |   | ||||||
|  |  $(objpfx)pldd: $(pldd-modules:%=$(objpfx)%.o) | ||||||
							
								
								
									
										57
									
								
								var/spack/repos/builtin/packages/glibc/95f5a9a-stub.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								var/spack/repos/builtin/packages/glibc/95f5a9a-stub.patch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,57 @@ | |||||||
|  | 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. | ||||||
|  |  | ||||||
|  | diff --git a/elf/static-stubs.c b/elf/static-stubs.c | ||||||
|  | new file mode 100644 | ||||||
|  | index 0000000000..6c5eebc3fb | ||||||
|  | --- /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 (); | ||||||
|  | +} | ||||||
							
								
								
									
										176
									
								
								var/spack/repos/builtin/packages/glibc/965cb60-2.5.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										176
									
								
								var/spack/repos/builtin/packages/glibc/965cb60-2.5.patch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,176 @@ | |||||||
|  | diff --git a/csu/libc-start.c b/csu/libc-start.c | ||||||
|  | index 194db6b1ec..f85ec9604e 100644 | ||||||
|  | --- a/csu/libc-start.c | ||||||
|  | +++ b/csu/libc-start.c | ||||||
|  | @@ -151,8 +151,8 @@ LIBC_START_MAIN (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL), | ||||||
|  |   | ||||||
|  |  # ifndef SHARED | ||||||
|  |    /* Set up the stack checker's canary.  */ | ||||||
|  | -  uintptr_t stack_chk_guard = _dl_setup_stack_chk_guard (); | ||||||
|  | -#  ifdef THREAD_SET_STACK_GUARD | ||||||
|  | +  uintptr_t stack_chk_guard = _dl_setup_stack_chk_guard (_dl_random); | ||||||
|  | +# ifdef THREAD_SET_STACK_GUARD | ||||||
|  |    THREAD_SET_STACK_GUARD (stack_chk_guard); | ||||||
|  |  #  else | ||||||
|  |    __stack_chk_guard = stack_chk_guard; | ||||||
|  | diff --git a/elf/dl-support.c b/elf/dl-support.c | ||||||
|  | index 4b7be6bc27..f62867abf1 100644 | ||||||
|  | --- a/elf/dl-support.c | ||||||
|  | +++ b/elf/dl-support.c | ||||||
|  | @@ -84,6 +84,9 @@ struct r_scope_elem _dl_initial_searchlist; | ||||||
|  |  int _dl_starting_up = 1; | ||||||
|  |  #endif | ||||||
|  |   | ||||||
|  | +/* Random data provided by the kernel.  */ | ||||||
|  | +void *_dl_random; | ||||||
|  | + | ||||||
|  |  /* Get architecture specific initializer.  */ | ||||||
|  |  #include <dl-procinfo.c> | ||||||
|  |   | ||||||
|  | @@ -218,6 +221,9 @@ _dl_aux_init (ElfW(auxv_t) *av) | ||||||
|  |  	__libc_enable_secure = av->a_un.a_val; | ||||||
|  |  	__libc_enable_secure_decided = 1; | ||||||
|  |  	break; | ||||||
|  | +      case AT_RANDOM: | ||||||
|  | +	_dl_random = (void *) av->a_un.a_val; | ||||||
|  | +	break; | ||||||
|  |        } | ||||||
|  |    if (seen == 0xf) | ||||||
|  |      { | ||||||
|  | diff --git a/elf/dl-sysdep.c b/elf/dl-sysdep.c | ||||||
|  | index 68e08f480a..133ba0d29f 100644 | ||||||
|  | --- a/elf/dl-sysdep.c | ||||||
|  | +++ b/elf/dl-sysdep.c | ||||||
|  | @@ -62,6 +62,7 @@ int __libc_multiple_libcs = 0;	/* Defining this here avoids the inclusion | ||||||
|  |  void *__libc_stack_end attribute_relro = NULL; | ||||||
|  |  rtld_hidden_data_def(__libc_stack_end) | ||||||
|  |  static ElfW(auxv_t) *_dl_auxv attribute_relro; | ||||||
|  | +void *_dl_random attribute_relro = NULL; | ||||||
|  |   | ||||||
|  |  #ifndef DL_FIND_ARG_COMPONENTS | ||||||
|  |  # define DL_FIND_ARG_COMPONENTS(cookie, argc, argv, envp, auxp)	\ | ||||||
|  | @@ -173,6 +174,9 @@ _dl_sysdep_start (void **start_argptr, | ||||||
|  |  	GLRO(dl_sysinfo_dso) = (void *) av->a_un.a_val; | ||||||
|  |  	break; | ||||||
|  |  #endif | ||||||
|  | +      case AT_RANDOM: | ||||||
|  | +	_dl_random = (void *) av->a_un.a_val; | ||||||
|  | +	break; | ||||||
|  |  #ifdef DL_PLATFORM_AUXV | ||||||
|  |        DL_PLATFORM_AUXV | ||||||
|  |  #endif | ||||||
|  | @@ -293,6 +297,7 @@ _dl_show_auxv (void) | ||||||
|  |  	  [AT_SECURE - 2] =		{ "AT_SECURE:       ", dec }, | ||||||
|  |  	  [AT_SYSINFO - 2] =		{ "AT_SYSINFO:      0x", hex }, | ||||||
|  |  	  [AT_SYSINFO_EHDR - 2] =	{ "AT_SYSINFO_EHDR: 0x", hex }, | ||||||
|  | +	  [AT_RANDOM - 2] =		{ "AT_RANDOM:       0x", hex }, | ||||||
|  |  	}; | ||||||
|  |        unsigned int idx = (unsigned int) (av->a_type - 2); | ||||||
|  |   | ||||||
|  | diff --git a/elf/rtld.c b/elf/rtld.c | ||||||
|  | index a357a46987..a02a319677 100644 | ||||||
|  | --- a/elf/rtld.c | ||||||
|  | +++ b/elf/rtld.c | ||||||
|  | @@ -1837,7 +1837,7 @@ ERROR: ld.so: object '%s' cannot be loaded as audit interface: %s; ignored.\n", | ||||||
|  |  #endif | ||||||
|  |   | ||||||
|  |    /* Set up the stack checker's canary.  */ | ||||||
|  | -  uintptr_t stack_chk_guard = _dl_setup_stack_chk_guard (); | ||||||
|  | +  uintptr_t stack_chk_guard = _dl_setup_stack_chk_guard (_dl_random); | ||||||
|  |  #ifdef THREAD_SET_STACK_GUARD | ||||||
|  |    THREAD_SET_STACK_GUARD (stack_chk_guard); | ||||||
|  |  #else | ||||||
|  | diff --git a/sysdeps/generic/dl-osinfo.h b/sysdeps/generic/dl-osinfo.h | ||||||
|  | index 60b84a900d..02ec28d424 100644 | ||||||
|  | --- a/sysdeps/generic/dl-osinfo.h | ||||||
|  | +++ b/sysdeps/generic/dl-osinfo.h | ||||||
|  | @@ -1,12 +1,29 @@ | ||||||
|  |  #include <stdint.h> | ||||||
|  |   | ||||||
|  |  static inline uintptr_t __attribute__ ((always_inline)) | ||||||
|  | -_dl_setup_stack_chk_guard (void) | ||||||
|  | +_dl_setup_stack_chk_guard (void *dl_random) | ||||||
|  |  { | ||||||
|  | -  uintptr_t ret = 0; | ||||||
|  | -  unsigned char *p = (unsigned char *) &ret; | ||||||
|  | -  p[sizeof (ret) - 1] = 255; | ||||||
|  | -  p[sizeof (ret) - 2] = '\n'; | ||||||
|  | -  p[0] = 0; | ||||||
|  | +  uintptr_t ret; | ||||||
|  | +  if (dl_random == NULL) | ||||||
|  | +    { | ||||||
|  | +      ret = 0; | ||||||
|  | +      unsigned char *p = (unsigned char *) &ret; | ||||||
|  | +      p[sizeof (ret) - 1] = 255; | ||||||
|  | +      p[sizeof (ret) - 2] = '\n'; | ||||||
|  | +      p[0] = 0; | ||||||
|  | +    } | ||||||
|  | +  else | ||||||
|  | +    memcmp (&ret, dl_random, sizeof (ret)); | ||||||
|  | +  return ret; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +static inline uintptr_t __attribute__ ((always_inline)) | ||||||
|  | +_dl_setup_pointer_guard (void *dl_random, uintptr_t stack_chk_guard) | ||||||
|  | +{ | ||||||
|  | +  uintptr_t ret; | ||||||
|  | +  if (dl_random == NULL) | ||||||
|  | +    ret = stack_chk_guard; | ||||||
|  | +  else | ||||||
|  | +    memcmp (&ret, (char *) dl_random + sizeof (ret), sizeof (ret)); | ||||||
|  |    return ret; | ||||||
|  |  } | ||||||
|  | diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h | ||||||
|  | index eee6141c6a..54789c0639 100644 | ||||||
|  | --- a/sysdeps/generic/ldsodefs.h | ||||||
|  | +++ b/sysdeps/generic/ldsodefs.h | ||||||
|  | @@ -740,6 +740,9 @@ weak_extern (_dl_starting_up) | ||||||
|  |  extern int _dl_starting_up_internal attribute_hidden; | ||||||
|  |  #endif | ||||||
|  |   | ||||||
|  | +/* Random data provided by the kernel.  */ | ||||||
|  | +extern void *_dl_random attribute_hidden; | ||||||
|  | + | ||||||
|  |  /* OS-dependent function to open the zero-fill device.  */ | ||||||
|  |  extern int _dl_sysdep_open_zero_fill (void); /* dl-sysdep.c */ | ||||||
|  |   | ||||||
|  | diff --git a/sysdeps/unix/sysv/linux/dl-osinfo.h b/sysdeps/unix/sysv/linux/dl-osinfo.h | ||||||
|  | index 0738501a56..d796651ff4 100644 | ||||||
|  | --- a/sysdeps/unix/sysv/linux/dl-osinfo.h | ||||||
|  | +++ b/sysdeps/unix/sysv/linux/dl-osinfo.h | ||||||
|  | @@ -159,22 +159,20 @@ _dl_discover_osversion (void) | ||||||
|  |    } while (0) | ||||||
|  |   | ||||||
|  |  static inline uintptr_t __attribute__ ((always_inline)) | ||||||
|  | -_dl_setup_stack_chk_guard (void) | ||||||
|  | +_dl_setup_stack_chk_guard (void *dl_random) | ||||||
|  |  { | ||||||
|  |    uintptr_t ret; | ||||||
|  | -#ifdef ENABLE_STACKGUARD_RANDOMIZE | ||||||
|  | -  int fd = __open ("/dev/urandom", O_RDONLY); | ||||||
|  | -  if (fd >= 0) | ||||||
|  | -    { | ||||||
|  | -      ssize_t reslen = __read (fd, &ret, sizeof (ret)); | ||||||
|  | -      __close (fd); | ||||||
|  | -      if (reslen == (ssize_t) sizeof (ret)) | ||||||
|  | -	return ret; | ||||||
|  | -    } | ||||||
|  | -#endif | ||||||
|  | -  ret = 0; | ||||||
|  | -  unsigned char *p = (unsigned char *) &ret; | ||||||
|  | -  p[sizeof (ret) - 1] = 255; | ||||||
|  | -  p[sizeof (ret) - 2] = '\n'; | ||||||
|  | +    /* We need in the moment only 8 bytes on 32-bit platforms and 16 | ||||||
|  | +       bytes on 64-bit platforms.  Therefore we can use the data | ||||||
|  | +       directly and not use the kernel-provided data to seed a PRNG.  */ | ||||||
|  | +    memcpy (&ret, dl_random, sizeof (ret)); | ||||||
|  | +  return ret; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +static inline uintptr_t __attribute__ ((always_inline)) | ||||||
|  | +_dl_setup_pointer_guard (void *dl_random, uintptr_t stack_chk_guard) | ||||||
|  | +{ | ||||||
|  | +  uintptr_t ret; | ||||||
|  | +    memcpy (&ret, (char *) dl_random + sizeof (ret), sizeof (ret)); | ||||||
|  |    return ret; | ||||||
|  |  } | ||||||
							
								
								
									
										176
									
								
								var/spack/repos/builtin/packages/glibc/965cb60-2.6.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										176
									
								
								var/spack/repos/builtin/packages/glibc/965cb60-2.6.patch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,176 @@ | |||||||
|  | diff --git a/csu/libc-start.c b/csu/libc-start.c | ||||||
|  | index 0ed993651e..a8b1be8c7d 100644 | ||||||
|  | --- a/csu/libc-start.c | ||||||
|  | +++ b/csu/libc-start.c | ||||||
|  | @@ -142,8 +142,8 @@ LIBC_START_MAIN (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL), | ||||||
|  |   | ||||||
|  |  # ifndef SHARED | ||||||
|  |    /* Set up the stack checker's canary.  */ | ||||||
|  | -  uintptr_t stack_chk_guard = _dl_setup_stack_chk_guard (); | ||||||
|  | -#  ifdef THREAD_SET_STACK_GUARD | ||||||
|  | +  uintptr_t stack_chk_guard = _dl_setup_stack_chk_guard (_dl_random); | ||||||
|  | +# ifdef THREAD_SET_STACK_GUARD | ||||||
|  |    THREAD_SET_STACK_GUARD (stack_chk_guard); | ||||||
|  |  #  else | ||||||
|  |    __stack_chk_guard = stack_chk_guard; | ||||||
|  | diff --git a/elf/dl-support.c b/elf/dl-support.c | ||||||
|  | index 2c11ac6881..321ed07a18 100644 | ||||||
|  | --- a/elf/dl-support.c | ||||||
|  | +++ b/elf/dl-support.c | ||||||
|  | @@ -84,6 +84,9 @@ struct r_scope_elem _dl_initial_searchlist; | ||||||
|  |  int _dl_starting_up = 1; | ||||||
|  |  #endif | ||||||
|  |   | ||||||
|  | +/* Random data provided by the kernel.  */ | ||||||
|  | +void *_dl_random; | ||||||
|  | + | ||||||
|  |  /* Get architecture specific initializer.  */ | ||||||
|  |  #include <dl-procinfo.c> | ||||||
|  |   | ||||||
|  | @@ -216,6 +219,9 @@ _dl_aux_init (ElfW(auxv_t) *av) | ||||||
|  |  	__libc_enable_secure = av->a_un.a_val; | ||||||
|  |  	__libc_enable_secure_decided = 1; | ||||||
|  |  	break; | ||||||
|  | +      case AT_RANDOM: | ||||||
|  | +	_dl_random = (void *) av->a_un.a_val; | ||||||
|  | +	break; | ||||||
|  |  # ifdef DL_PLATFORM_AUXV | ||||||
|  |        DL_PLATFORM_AUXV | ||||||
|  |  # endif | ||||||
|  | diff --git a/elf/dl-sysdep.c b/elf/dl-sysdep.c | ||||||
|  | index 85e331a90f..6ce20b5150 100644 | ||||||
|  | --- a/elf/dl-sysdep.c | ||||||
|  | +++ b/elf/dl-sysdep.c | ||||||
|  | @@ -62,6 +62,7 @@ int __libc_multiple_libcs = 0;	/* Defining this here avoids the inclusion | ||||||
|  |  void *__libc_stack_end attribute_relro = NULL; | ||||||
|  |  rtld_hidden_data_def(__libc_stack_end) | ||||||
|  |  static ElfW(auxv_t) *_dl_auxv attribute_relro; | ||||||
|  | +void *_dl_random attribute_relro = NULL; | ||||||
|  |   | ||||||
|  |  #ifndef DL_FIND_ARG_COMPONENTS | ||||||
|  |  # define DL_FIND_ARG_COMPONENTS(cookie, argc, argv, envp, auxp)	\ | ||||||
|  | @@ -173,6 +174,9 @@ _dl_sysdep_start (void **start_argptr, | ||||||
|  |  	GLRO(dl_sysinfo_dso) = (void *) av->a_un.a_val; | ||||||
|  |  	break; | ||||||
|  |  #endif | ||||||
|  | +      case AT_RANDOM: | ||||||
|  | +	_dl_random = (void *) av->a_un.a_val; | ||||||
|  | +	break; | ||||||
|  |  #ifdef DL_PLATFORM_AUXV | ||||||
|  |        DL_PLATFORM_AUXV | ||||||
|  |  #endif | ||||||
|  | @@ -293,6 +297,7 @@ _dl_show_auxv (void) | ||||||
|  |  	  [AT_SECURE - 2] =		{ "AT_SECURE:       ", dec }, | ||||||
|  |  	  [AT_SYSINFO - 2] =		{ "AT_SYSINFO:      0x", hex }, | ||||||
|  |  	  [AT_SYSINFO_EHDR - 2] =	{ "AT_SYSINFO_EHDR: 0x", hex }, | ||||||
|  | +	  [AT_RANDOM - 2] =		{ "AT_RANDOM:       0x", hex }, | ||||||
|  |  	}; | ||||||
|  |        unsigned int idx = (unsigned int) (av->a_type - 2); | ||||||
|  |   | ||||||
|  | diff --git a/elf/rtld.c b/elf/rtld.c | ||||||
|  | index 7612a69324..e77ac43713 100644 | ||||||
|  | --- a/elf/rtld.c | ||||||
|  | +++ b/elf/rtld.c | ||||||
|  | @@ -1816,7 +1816,7 @@ ERROR: ld.so: object '%s' cannot be loaded as audit interface: %s; ignored.\n", | ||||||
|  |      tcbp = init_tls (); | ||||||
|  |   | ||||||
|  |    /* Set up the stack checker's canary.  */ | ||||||
|  | -  uintptr_t stack_chk_guard = _dl_setup_stack_chk_guard (); | ||||||
|  | +  uintptr_t stack_chk_guard = _dl_setup_stack_chk_guard (_dl_random); | ||||||
|  |  #ifdef THREAD_SET_STACK_GUARD | ||||||
|  |    THREAD_SET_STACK_GUARD (stack_chk_guard); | ||||||
|  |  #else | ||||||
|  | diff --git a/sysdeps/generic/dl-osinfo.h b/sysdeps/generic/dl-osinfo.h | ||||||
|  | index 60b84a900d..02ec28d424 100644 | ||||||
|  | --- a/sysdeps/generic/dl-osinfo.h | ||||||
|  | +++ b/sysdeps/generic/dl-osinfo.h | ||||||
|  | @@ -1,12 +1,29 @@ | ||||||
|  |  #include <stdint.h> | ||||||
|  |   | ||||||
|  |  static inline uintptr_t __attribute__ ((always_inline)) | ||||||
|  | -_dl_setup_stack_chk_guard (void) | ||||||
|  | +_dl_setup_stack_chk_guard (void *dl_random) | ||||||
|  |  { | ||||||
|  | -  uintptr_t ret = 0; | ||||||
|  | -  unsigned char *p = (unsigned char *) &ret; | ||||||
|  | -  p[sizeof (ret) - 1] = 255; | ||||||
|  | -  p[sizeof (ret) - 2] = '\n'; | ||||||
|  | -  p[0] = 0; | ||||||
|  | +  uintptr_t ret; | ||||||
|  | +  if (dl_random == NULL) | ||||||
|  | +    { | ||||||
|  | +      ret = 0; | ||||||
|  | +      unsigned char *p = (unsigned char *) &ret; | ||||||
|  | +      p[sizeof (ret) - 1] = 255; | ||||||
|  | +      p[sizeof (ret) - 2] = '\n'; | ||||||
|  | +      p[0] = 0; | ||||||
|  | +    } | ||||||
|  | +  else | ||||||
|  | +    memcmp (&ret, dl_random, sizeof (ret)); | ||||||
|  | +  return ret; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +static inline uintptr_t __attribute__ ((always_inline)) | ||||||
|  | +_dl_setup_pointer_guard (void *dl_random, uintptr_t stack_chk_guard) | ||||||
|  | +{ | ||||||
|  | +  uintptr_t ret; | ||||||
|  | +  if (dl_random == NULL) | ||||||
|  | +    ret = stack_chk_guard; | ||||||
|  | +  else | ||||||
|  | +    memcmp (&ret, (char *) dl_random + sizeof (ret), sizeof (ret)); | ||||||
|  |    return ret; | ||||||
|  |  } | ||||||
|  | diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h | ||||||
|  | index aefd105f0a..929b91b56c 100644 | ||||||
|  | --- a/sysdeps/generic/ldsodefs.h | ||||||
|  | +++ b/sysdeps/generic/ldsodefs.h | ||||||
|  | @@ -726,6 +726,9 @@ weak_extern (_dl_starting_up) | ||||||
|  |  extern int _dl_starting_up_internal attribute_hidden; | ||||||
|  |  #endif | ||||||
|  |   | ||||||
|  | +/* Random data provided by the kernel.  */ | ||||||
|  | +extern void *_dl_random attribute_hidden; | ||||||
|  | + | ||||||
|  |  /* OS-dependent function to open the zero-fill device.  */ | ||||||
|  |  extern int _dl_sysdep_open_zero_fill (void); /* dl-sysdep.c */ | ||||||
|  |   | ||||||
|  | diff --git a/sysdeps/unix/sysv/linux/dl-osinfo.h b/sysdeps/unix/sysv/linux/dl-osinfo.h | ||||||
|  | index 0738501a56..d796651ff4 100644 | ||||||
|  | --- a/sysdeps/unix/sysv/linux/dl-osinfo.h | ||||||
|  | +++ b/sysdeps/unix/sysv/linux/dl-osinfo.h | ||||||
|  | @@ -159,22 +159,20 @@ _dl_discover_osversion (void) | ||||||
|  |    } while (0) | ||||||
|  |   | ||||||
|  |  static inline uintptr_t __attribute__ ((always_inline)) | ||||||
|  | -_dl_setup_stack_chk_guard (void) | ||||||
|  | +_dl_setup_stack_chk_guard (void *dl_random) | ||||||
|  |  { | ||||||
|  |    uintptr_t ret; | ||||||
|  | -#ifdef ENABLE_STACKGUARD_RANDOMIZE | ||||||
|  | -  int fd = __open ("/dev/urandom", O_RDONLY); | ||||||
|  | -  if (fd >= 0) | ||||||
|  | -    { | ||||||
|  | -      ssize_t reslen = __read (fd, &ret, sizeof (ret)); | ||||||
|  | -      __close (fd); | ||||||
|  | -      if (reslen == (ssize_t) sizeof (ret)) | ||||||
|  | -	return ret; | ||||||
|  | -    } | ||||||
|  | -#endif | ||||||
|  | -  ret = 0; | ||||||
|  | -  unsigned char *p = (unsigned char *) &ret; | ||||||
|  | -  p[sizeof (ret) - 1] = 255; | ||||||
|  | -  p[sizeof (ret) - 2] = '\n'; | ||||||
|  | +    /* We need in the moment only 8 bytes on 32-bit platforms and 16 | ||||||
|  | +       bytes on 64-bit platforms.  Therefore we can use the data | ||||||
|  | +       directly and not use the kernel-provided data to seed a PRNG.  */ | ||||||
|  | +    memcpy (&ret, dl_random, sizeof (ret)); | ||||||
|  | +  return ret; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +static inline uintptr_t __attribute__ ((always_inline)) | ||||||
|  | +_dl_setup_pointer_guard (void *dl_random, uintptr_t stack_chk_guard) | ||||||
|  | +{ | ||||||
|  | +  uintptr_t ret; | ||||||
|  | +    memcpy (&ret, (char *) dl_random + sizeof (ret), sizeof (ret)); | ||||||
|  |    return ret; | ||||||
|  |  } | ||||||
							
								
								
									
										174
									
								
								var/spack/repos/builtin/packages/glibc/965cb60-2.7.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										174
									
								
								var/spack/repos/builtin/packages/glibc/965cb60-2.7.patch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,174 @@ | |||||||
|  | diff --git a/csu/libc-start.c b/csu/libc-start.c | ||||||
|  | index a14ed71616..8b3f436f46 100644 | ||||||
|  | --- a/csu/libc-start.c | ||||||
|  | +++ b/csu/libc-start.c | ||||||
|  | @@ -140,7 +140,7 @@ LIBC_START_MAIN (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL), | ||||||
|  |    __pthread_initialize_minimal (); | ||||||
|  |   | ||||||
|  |    /* Set up the stack checker's canary.  */ | ||||||
|  | -  uintptr_t stack_chk_guard = _dl_setup_stack_chk_guard (); | ||||||
|  | +  uintptr_t stack_chk_guard = _dl_setup_stack_chk_guard (_dl_random); | ||||||
|  |  # ifdef THREAD_SET_STACK_GUARD | ||||||
|  |    THREAD_SET_STACK_GUARD (stack_chk_guard); | ||||||
|  |  # else | ||||||
|  | diff --git a/elf/dl-support.c b/elf/dl-support.c | ||||||
|  | index 2c11ac6881..321ed07a18 100644 | ||||||
|  | --- a/elf/dl-support.c | ||||||
|  | +++ b/elf/dl-support.c | ||||||
|  | @@ -84,6 +84,9 @@ struct r_scope_elem _dl_initial_searchlist; | ||||||
|  |  int _dl_starting_up = 1; | ||||||
|  |  #endif | ||||||
|  |   | ||||||
|  | +/* Random data provided by the kernel.  */ | ||||||
|  | +void *_dl_random; | ||||||
|  | + | ||||||
|  |  /* Get architecture specific initializer.  */ | ||||||
|  |  #include <dl-procinfo.c> | ||||||
|  |   | ||||||
|  | @@ -216,6 +219,9 @@ _dl_aux_init (ElfW(auxv_t) *av) | ||||||
|  |  	__libc_enable_secure = av->a_un.a_val; | ||||||
|  |  	__libc_enable_secure_decided = 1; | ||||||
|  |  	break; | ||||||
|  | +      case AT_RANDOM: | ||||||
|  | +	_dl_random = (void *) av->a_un.a_val; | ||||||
|  | +	break; | ||||||
|  |  # ifdef DL_PLATFORM_AUXV | ||||||
|  |        DL_PLATFORM_AUXV | ||||||
|  |  # endif | ||||||
|  | diff --git a/elf/dl-sysdep.c b/elf/dl-sysdep.c | ||||||
|  | index 85e331a90f..6ce20b5150 100644 | ||||||
|  | --- a/elf/dl-sysdep.c | ||||||
|  | +++ b/elf/dl-sysdep.c | ||||||
|  | @@ -62,6 +62,7 @@ int __libc_multiple_libcs = 0;	/* Defining this here avoids the inclusion | ||||||
|  |  void *__libc_stack_end attribute_relro = NULL; | ||||||
|  |  rtld_hidden_data_def(__libc_stack_end) | ||||||
|  |  static ElfW(auxv_t) *_dl_auxv attribute_relro; | ||||||
|  | +void *_dl_random attribute_relro = NULL; | ||||||
|  |   | ||||||
|  |  #ifndef DL_FIND_ARG_COMPONENTS | ||||||
|  |  # define DL_FIND_ARG_COMPONENTS(cookie, argc, argv, envp, auxp)	\ | ||||||
|  | @@ -173,6 +174,9 @@ _dl_sysdep_start (void **start_argptr, | ||||||
|  |  	GLRO(dl_sysinfo_dso) = (void *) av->a_un.a_val; | ||||||
|  |  	break; | ||||||
|  |  #endif | ||||||
|  | +      case AT_RANDOM: | ||||||
|  | +	_dl_random = (void *) av->a_un.a_val; | ||||||
|  | +	break; | ||||||
|  |  #ifdef DL_PLATFORM_AUXV | ||||||
|  |        DL_PLATFORM_AUXV | ||||||
|  |  #endif | ||||||
|  | @@ -293,6 +297,7 @@ _dl_show_auxv (void) | ||||||
|  |  	  [AT_SECURE - 2] =		{ "AT_SECURE:       ", dec }, | ||||||
|  |  	  [AT_SYSINFO - 2] =		{ "AT_SYSINFO:      0x", hex }, | ||||||
|  |  	  [AT_SYSINFO_EHDR - 2] =	{ "AT_SYSINFO_EHDR: 0x", hex }, | ||||||
|  | +	  [AT_RANDOM - 2] =		{ "AT_RANDOM:       0x", hex }, | ||||||
|  |  	}; | ||||||
|  |        unsigned int idx = (unsigned int) (av->a_type - 2); | ||||||
|  |   | ||||||
|  | diff --git a/elf/rtld.c b/elf/rtld.c | ||||||
|  | index 7612a69324..e77ac43713 100644 | ||||||
|  | --- a/elf/rtld.c | ||||||
|  | +++ b/elf/rtld.c | ||||||
|  | @@ -1816,7 +1816,7 @@ ERROR: ld.so: object '%s' cannot be loaded as audit interface: %s; ignored.\n", | ||||||
|  |      tcbp = init_tls (); | ||||||
|  |   | ||||||
|  |    /* Set up the stack checker's canary.  */ | ||||||
|  | -  uintptr_t stack_chk_guard = _dl_setup_stack_chk_guard (); | ||||||
|  | +  uintptr_t stack_chk_guard = _dl_setup_stack_chk_guard (_dl_random); | ||||||
|  |  #ifdef THREAD_SET_STACK_GUARD | ||||||
|  |    THREAD_SET_STACK_GUARD (stack_chk_guard); | ||||||
|  |  #else | ||||||
|  | diff --git a/sysdeps/generic/dl-osinfo.h b/sysdeps/generic/dl-osinfo.h | ||||||
|  | index 60b84a900d..02ec28d424 100644 | ||||||
|  | --- a/sysdeps/generic/dl-osinfo.h | ||||||
|  | +++ b/sysdeps/generic/dl-osinfo.h | ||||||
|  | @@ -1,12 +1,29 @@ | ||||||
|  |  #include <stdint.h> | ||||||
|  |   | ||||||
|  |  static inline uintptr_t __attribute__ ((always_inline)) | ||||||
|  | -_dl_setup_stack_chk_guard (void) | ||||||
|  | +_dl_setup_stack_chk_guard (void *dl_random) | ||||||
|  |  { | ||||||
|  | -  uintptr_t ret = 0; | ||||||
|  | -  unsigned char *p = (unsigned char *) &ret; | ||||||
|  | -  p[sizeof (ret) - 1] = 255; | ||||||
|  | -  p[sizeof (ret) - 2] = '\n'; | ||||||
|  | -  p[0] = 0; | ||||||
|  | +  uintptr_t ret; | ||||||
|  | +  if (dl_random == NULL) | ||||||
|  | +    { | ||||||
|  | +      ret = 0; | ||||||
|  | +      unsigned char *p = (unsigned char *) &ret; | ||||||
|  | +      p[sizeof (ret) - 1] = 255; | ||||||
|  | +      p[sizeof (ret) - 2] = '\n'; | ||||||
|  | +      p[0] = 0; | ||||||
|  | +    } | ||||||
|  | +  else | ||||||
|  | +    memcmp (&ret, dl_random, sizeof (ret)); | ||||||
|  | +  return ret; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +static inline uintptr_t __attribute__ ((always_inline)) | ||||||
|  | +_dl_setup_pointer_guard (void *dl_random, uintptr_t stack_chk_guard) | ||||||
|  | +{ | ||||||
|  | +  uintptr_t ret; | ||||||
|  | +  if (dl_random == NULL) | ||||||
|  | +    ret = stack_chk_guard; | ||||||
|  | +  else | ||||||
|  | +    memcmp (&ret, (char *) dl_random + sizeof (ret), sizeof (ret)); | ||||||
|  |    return ret; | ||||||
|  |  } | ||||||
|  | diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h | ||||||
|  | index 958a099b82..c4d2874085 100644 | ||||||
|  | --- a/sysdeps/generic/ldsodefs.h | ||||||
|  | +++ b/sysdeps/generic/ldsodefs.h | ||||||
|  | @@ -726,6 +726,9 @@ weak_extern (_dl_starting_up) | ||||||
|  |  extern int _dl_starting_up_internal attribute_hidden; | ||||||
|  |  #endif | ||||||
|  |   | ||||||
|  | +/* Random data provided by the kernel.  */ | ||||||
|  | +extern void *_dl_random attribute_hidden; | ||||||
|  | + | ||||||
|  |  /* OS-dependent function to open the zero-fill device.  */ | ||||||
|  |  extern int _dl_sysdep_open_zero_fill (void); /* dl-sysdep.c */ | ||||||
|  |   | ||||||
|  | diff --git a/sysdeps/unix/sysv/linux/dl-osinfo.h b/sysdeps/unix/sysv/linux/dl-osinfo.h | ||||||
|  | index 082790f63b..d90f228942 100644 | ||||||
|  | --- a/sysdeps/unix/sysv/linux/dl-osinfo.h | ||||||
|  | +++ b/sysdeps/unix/sysv/linux/dl-osinfo.h | ||||||
|  | @@ -154,22 +154,20 @@ _dl_discover_osversion (void) | ||||||
|  |    } while (0) | ||||||
|  |   | ||||||
|  |  static inline uintptr_t __attribute__ ((always_inline)) | ||||||
|  | -_dl_setup_stack_chk_guard (void) | ||||||
|  | +_dl_setup_stack_chk_guard (void *dl_random) | ||||||
|  |  { | ||||||
|  |    uintptr_t ret; | ||||||
|  | -#ifdef ENABLE_STACKGUARD_RANDOMIZE | ||||||
|  | -  int fd = __open ("/dev/urandom", O_RDONLY); | ||||||
|  | -  if (fd >= 0) | ||||||
|  | -    { | ||||||
|  | -      ssize_t reslen = __read (fd, &ret, sizeof (ret)); | ||||||
|  | -      __close (fd); | ||||||
|  | -      if (reslen == (ssize_t) sizeof (ret)) | ||||||
|  | -	return ret; | ||||||
|  | -    } | ||||||
|  | -#endif | ||||||
|  | -  ret = 0; | ||||||
|  | -  unsigned char *p = (unsigned char *) &ret; | ||||||
|  | -  p[sizeof (ret) - 1] = 255; | ||||||
|  | -  p[sizeof (ret) - 2] = '\n'; | ||||||
|  | +    /* We need in the moment only 8 bytes on 32-bit platforms and 16 | ||||||
|  | +       bytes on 64-bit platforms.  Therefore we can use the data | ||||||
|  | +       directly and not use the kernel-provided data to seed a PRNG.  */ | ||||||
|  | +    memcpy (&ret, dl_random, sizeof (ret)); | ||||||
|  | +  return ret; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +static inline uintptr_t __attribute__ ((always_inline)) | ||||||
|  | +_dl_setup_pointer_guard (void *dl_random, uintptr_t stack_chk_guard) | ||||||
|  | +{ | ||||||
|  | +  uintptr_t ret; | ||||||
|  | +    memcpy (&ret, (char *) dl_random + sizeof (ret), sizeof (ret)); | ||||||
|  |    return ret; | ||||||
|  |  } | ||||||
							
								
								
									
										205
									
								
								var/spack/repos/builtin/packages/glibc/965cb60.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										205
									
								
								var/spack/repos/builtin/packages/glibc/965cb60.patch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,205 @@ | |||||||
|  | From 965cb60a21674edb8e20b1a2a41297bcd4622361 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Ulrich Drepper <drepper@redhat.com> | ||||||
|  | Date: Sun, 11 Jan 2009 04:44:06 +0000 | ||||||
|  | Subject: [PATCH] * sysdeps/generic/dl-osinfo.h (_dl_setup_stack_chk_guard) | ||||||
|  |  | ||||||
|  | diff --git a/elf/dl-support.c b/elf/dl-support.c | ||||||
|  | index 6bd573ec57..7b3ccf3d4d 100644 | ||||||
|  | --- a/elf/dl-support.c | ||||||
|  | +++ b/elf/dl-support.c | ||||||
|  | @@ -84,6 +84,9 @@ struct r_scope_elem _dl_initial_searchlist; | ||||||
|  |  int _dl_starting_up = 1; | ||||||
|  |  #endif | ||||||
|  |   | ||||||
|  | +/* Random data provided by the kernel.  */ | ||||||
|  | +void *_dl_random; | ||||||
|  | + | ||||||
|  |  /* Get architecture specific initializer.  */ | ||||||
|  |  #include <dl-procinfo.c> | ||||||
|  |   | ||||||
|  | @@ -216,6 +219,9 @@ _dl_aux_init (ElfW(auxv_t) *av) | ||||||
|  |  	__libc_enable_secure = av->a_un.a_val; | ||||||
|  |  	__libc_enable_secure_decided = 1; | ||||||
|  |  	break; | ||||||
|  | +      case AT_RANDOM: | ||||||
|  | +	_dl_random = (void *) av->a_un.a_val; | ||||||
|  | +	break; | ||||||
|  |  # ifdef DL_PLATFORM_AUXV | ||||||
|  |        DL_PLATFORM_AUXV | ||||||
|  |  # endif | ||||||
|  | diff --git a/elf/dl-sysdep.c b/elf/dl-sysdep.c | ||||||
|  | index e6f4272a63..29ae895473 100644 | ||||||
|  | --- a/elf/dl-sysdep.c | ||||||
|  | +++ b/elf/dl-sysdep.c | ||||||
|  | @@ -62,6 +62,7 @@ int __libc_multiple_libcs = 0;	/* Defining this here avoids the inclusion | ||||||
|  |  void *__libc_stack_end attribute_relro = NULL; | ||||||
|  |  rtld_hidden_data_def(__libc_stack_end) | ||||||
|  |  static ElfW(auxv_t) *_dl_auxv attribute_relro; | ||||||
|  | +void *_dl_random attribute_relro = NULL; | ||||||
|  |   | ||||||
|  |  #ifndef DL_FIND_ARG_COMPONENTS | ||||||
|  |  # define DL_FIND_ARG_COMPONENTS(cookie, argc, argv, envp, auxp)	\ | ||||||
|  | @@ -173,6 +174,9 @@ _dl_sysdep_start (void **start_argptr, | ||||||
|  |  	GLRO(dl_sysinfo_dso) = (void *) av->a_un.a_val; | ||||||
|  |  	break; | ||||||
|  |  #endif | ||||||
|  | +      case AT_RANDOM: | ||||||
|  | +	_dl_random = (void *) av->a_un.a_val; | ||||||
|  | +	break; | ||||||
|  |  #ifdef DL_PLATFORM_AUXV | ||||||
|  |        DL_PLATFORM_AUXV | ||||||
|  |  #endif | ||||||
|  | @@ -294,6 +298,7 @@ _dl_show_auxv (void) | ||||||
|  |  	  [AT_SECURE - 2] =		{ "AT_SECURE:       ", dec }, | ||||||
|  |  	  [AT_SYSINFO - 2] =		{ "AT_SYSINFO:      0x", hex }, | ||||||
|  |  	  [AT_SYSINFO_EHDR - 2] =	{ "AT_SYSINFO_EHDR: 0x", hex }, | ||||||
|  | +	  [AT_RANDOM - 2] =		{ "AT_RANDOM:       0x", hex }, | ||||||
|  |  	}; | ||||||
|  |        unsigned int idx = (unsigned int) (av->a_type - 2); | ||||||
|  |   | ||||||
|  | diff --git a/elf/rtld.c b/elf/rtld.c | ||||||
|  | index 46bece7fa3..60d414d637 100644 | ||||||
|  | --- a/elf/rtld.c | ||||||
|  | +++ b/elf/rtld.c | ||||||
|  | @@ -841,7 +841,7 @@ static void | ||||||
|  |  security_init (void) | ||||||
|  |  { | ||||||
|  |    /* Set up the stack checker's canary.  */ | ||||||
|  | -  uintptr_t stack_chk_guard = _dl_setup_stack_chk_guard (); | ||||||
|  | +  uintptr_t stack_chk_guard = _dl_setup_stack_chk_guard (_dl_random); | ||||||
|  |  #ifdef THREAD_SET_STACK_GUARD | ||||||
|  |    THREAD_SET_STACK_GUARD (stack_chk_guard); | ||||||
|  |  #else | ||||||
|  | @@ -851,18 +851,18 @@ security_init (void) | ||||||
|  |    /* Set up the pointer guard as well, if necessary.  */ | ||||||
|  |    if (GLRO(dl_pointer_guard)) | ||||||
|  |      { | ||||||
|  | -      // XXX If it is cheap, we should use a separate value. | ||||||
|  | -      uintptr_t pointer_chk_guard = stack_chk_guard; | ||||||
|  | -#ifndef HP_TIMING_NONAVAIL | ||||||
|  | -      hp_timing_t now; | ||||||
|  | -      HP_TIMING_NOW (now); | ||||||
|  | -      pointer_chk_guard ^= now; | ||||||
|  | -#endif | ||||||
|  | +      uintptr_t pointer_chk_guard = _dl_setup_pointer_guard (_dl_random, | ||||||
|  | +							     stack_chk_guard); | ||||||
|  |  #ifdef THREAD_SET_POINTER_GUARD | ||||||
|  |        THREAD_SET_POINTER_GUARD (pointer_chk_guard); | ||||||
|  |  #endif | ||||||
|  |        __pointer_chk_guard_local = pointer_chk_guard; | ||||||
|  |      } | ||||||
|  | + | ||||||
|  | +  /* We do not need the _dl_random value anymore.  The less | ||||||
|  | +     information we leave behind, the better, so clear the | ||||||
|  | +     variable.  */ | ||||||
|  | +  _dl_random = NULL; | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |   | ||||||
|  | diff --git a/sysdeps/generic/dl-osinfo.h b/sysdeps/generic/dl-osinfo.h | ||||||
|  | index 60b84a900d..02ec28d424 100644 | ||||||
|  | --- a/sysdeps/generic/dl-osinfo.h | ||||||
|  | +++ b/sysdeps/generic/dl-osinfo.h | ||||||
|  | @@ -1,12 +1,29 @@ | ||||||
|  |  #include <stdint.h> | ||||||
|  |   | ||||||
|  |  static inline uintptr_t __attribute__ ((always_inline)) | ||||||
|  | -_dl_setup_stack_chk_guard (void) | ||||||
|  | +_dl_setup_stack_chk_guard (void *dl_random) | ||||||
|  |  { | ||||||
|  | -  uintptr_t ret = 0; | ||||||
|  | -  unsigned char *p = (unsigned char *) &ret; | ||||||
|  | -  p[sizeof (ret) - 1] = 255; | ||||||
|  | -  p[sizeof (ret) - 2] = '\n'; | ||||||
|  | -  p[0] = 0; | ||||||
|  | +  uintptr_t ret; | ||||||
|  | +  if (dl_random == NULL) | ||||||
|  | +    { | ||||||
|  | +      ret = 0; | ||||||
|  | +      unsigned char *p = (unsigned char *) &ret; | ||||||
|  | +      p[sizeof (ret) - 1] = 255; | ||||||
|  | +      p[sizeof (ret) - 2] = '\n'; | ||||||
|  | +      p[0] = 0; | ||||||
|  | +    } | ||||||
|  | +  else | ||||||
|  | +    memcmp (&ret, dl_random, sizeof (ret)); | ||||||
|  | +  return ret; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +static inline uintptr_t __attribute__ ((always_inline)) | ||||||
|  | +_dl_setup_pointer_guard (void *dl_random, uintptr_t stack_chk_guard) | ||||||
|  | +{ | ||||||
|  | +  uintptr_t ret; | ||||||
|  | +  if (dl_random == NULL) | ||||||
|  | +    ret = stack_chk_guard; | ||||||
|  | +  else | ||||||
|  | +    memcmp (&ret, (char *) dl_random + sizeof (ret), sizeof (ret)); | ||||||
|  |    return ret; | ||||||
|  |  } | ||||||
|  | diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h | ||||||
|  | index 4d857404a3..f5606f373f 100644 | ||||||
|  | --- a/sysdeps/generic/ldsodefs.h | ||||||
|  | +++ b/sysdeps/generic/ldsodefs.h | ||||||
|  | @@ -731,6 +731,9 @@ weak_extern (_dl_starting_up) | ||||||
|  |  extern int _dl_starting_up_internal attribute_hidden; | ||||||
|  |  #endif | ||||||
|  |   | ||||||
|  | +/* Random data provided by the kernel.  */ | ||||||
|  | +extern void *_dl_random attribute_hidden; | ||||||
|  | + | ||||||
|  |  /* OS-dependent function to open the zero-fill device.  */ | ||||||
|  |  extern int _dl_sysdep_open_zero_fill (void); /* dl-sysdep.c */ | ||||||
|  |   | ||||||
|  | diff --git a/sysdeps/unix/sysv/linux/dl-osinfo.h b/sysdeps/unix/sysv/linux/dl-osinfo.h | ||||||
|  | index 5271d4e4de..ee8eaf20e4 100644 | ||||||
|  | --- a/sysdeps/unix/sysv/linux/dl-osinfo.h | ||||||
|  | +++ b/sysdeps/unix/sysv/linux/dl-osinfo.h | ||||||
|  | @@ -60,22 +60,20 @@ dl_fatal (const char *str) | ||||||
|  |    } while (0) | ||||||
|  |   | ||||||
|  |  static inline uintptr_t __attribute__ ((always_inline)) | ||||||
|  | -_dl_setup_stack_chk_guard (void) | ||||||
|  | +_dl_setup_stack_chk_guard (void *dl_random) | ||||||
|  |  { | ||||||
|  |    uintptr_t ret; | ||||||
|  | -#ifdef ENABLE_STACKGUARD_RANDOMIZE | ||||||
|  | -  int fd = __open ("/dev/urandom", O_RDONLY); | ||||||
|  | -  if (fd >= 0) | ||||||
|  | -    { | ||||||
|  | -      ssize_t reslen = __read (fd, &ret, sizeof (ret)); | ||||||
|  | -      __close (fd); | ||||||
|  | -      if (reslen == (ssize_t) sizeof (ret)) | ||||||
|  | -	return ret; | ||||||
|  | -    } | ||||||
|  | -#endif | ||||||
|  | -  ret = 0; | ||||||
|  | -  unsigned char *p = (unsigned char *) &ret; | ||||||
|  | -  p[sizeof (ret) - 1] = 255; | ||||||
|  | -  p[sizeof (ret) - 2] = '\n'; | ||||||
|  | +    /* We need in the moment only 8 bytes on 32-bit platforms and 16 | ||||||
|  | +       bytes on 64-bit platforms.  Therefore we can use the data | ||||||
|  | +       directly and not use the kernel-provided data to seed a PRNG.  */ | ||||||
|  | +    memcpy (&ret, dl_random, sizeof (ret)); | ||||||
|  | +  return ret; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +static inline uintptr_t __attribute__ ((always_inline)) | ||||||
|  | +_dl_setup_pointer_guard (void *dl_random, uintptr_t stack_chk_guard) | ||||||
|  | +{ | ||||||
|  | +  uintptr_t ret; | ||||||
|  | +    memcpy (&ret, (char *) dl_random + sizeof (ret), sizeof (ret)); | ||||||
|  |    return ret; | ||||||
|  |  } | ||||||
|  | diff --git a/csu/libc-start.c b/csu/libc-start.c | ||||||
|  | index a14ed71616a..80b672f88d8 100644 | ||||||
|  | --- a/csu/libc-start.c | ||||||
|  | +++ b/csu/libc-start.c | ||||||
|  | @@ -140,7 +140,7 @@ LIBC_START_MAIN (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL), | ||||||
|  |    __pthread_initialize_minimal (); | ||||||
|  |   | ||||||
|  |    /* Set up the stack checker's canary.  */ | ||||||
|  | -  uintptr_t stack_chk_guard = _dl_setup_stack_chk_guard (); | ||||||
|  | +  uintptr_t stack_chk_guard = _dl_setup_stack_chk_guard (_dl_random); | ||||||
|  |  # ifdef THREAD_SET_STACK_GUARD | ||||||
|  |    THREAD_SET_STACK_GUARD (stack_chk_guard); | ||||||
|  |  # else | ||||||
| @@ -57,11 +57,6 @@ class Glibc(AutotoolsPackage, GNUMirrorPackage): | |||||||
|     version("2.6.1", sha256="6be7639ccad715d25eef560ce9d1637ef206fb9a162714f6ab8167fc0d971cae") |     version("2.6.1", sha256="6be7639ccad715d25eef560ce9d1637ef206fb9a162714f6ab8167fc0d971cae") | ||||||
|     version("2.5", sha256="16d3ac4e86eed75d85d80f1f214a6bd58d27f13590966b5ad0cc181df85a3493") |     version("2.5", sha256="16d3ac4e86eed75d85d80f1f214a6bd58d27f13590966b5ad0cc181df85a3493") | ||||||
| 
 | 
 | ||||||
|     # Spack commit 29aa7117f42f758bc537e03e4bedf66ced0accfa has older versions |  | ||||||
|     # of glibc, but they are removed, because glibc < 2.17 links against |  | ||||||
|     # libgcc_s and libgcc_eh, see glibc commit "Avoid use of libgcc_s and |  | ||||||
|     # libgcc_eh when building glibc." 95f5a9a866695da4e038aa4e6ccbbfd5d9cf63b7 |  | ||||||
| 
 |  | ||||||
|     # Fix for newer GCC, related to -fno-common |     # Fix for newer GCC, related to -fno-common | ||||||
|     patch("locs.patch", when="@2.23:2.25") |     patch("locs.patch", when="@2.23:2.25") | ||||||
|     patch("locs-2.22.patch", when="@:2.22") |     patch("locs-2.22.patch", when="@:2.22") | ||||||
| @@ -75,6 +70,13 @@ class Glibc(AutotoolsPackage, GNUMirrorPackage): | |||||||
|     # rpc/types.h include issue, should be from local version, not system. |     # rpc/types.h include issue, should be from local version, not system. | ||||||
|     patch("fb21f89.patch", when="@:2.16") |     patch("fb21f89.patch", when="@:2.16") | ||||||
| 
 | 
 | ||||||
|  |     # Avoid linking libgcc_eh | ||||||
|  |     patch("95f5a9a-stub.patch", when="@:2.16") | ||||||
|  |     patch("95f5a9a-2.16.patch", when="@2.16") | ||||||
|  |     patch("95f5a9a-2.15.patch", when="@2.14:2.15") | ||||||
|  |     patch("95f5a9a-2.13.patch", when="@2.12:2.13") | ||||||
|  |     patch("95f5a9a-2.11.patch", when="@:2.11") | ||||||
|  | 
 | ||||||
|     # Use init_array (modified commit 4a531bb to unconditionally define |     # Use init_array (modified commit 4a531bb to unconditionally define | ||||||
|     # NO_CTORS_DTORS_SECTIONS) |     # NO_CTORS_DTORS_SECTIONS) | ||||||
|     patch("4a531bb.patch", when="@:2.12") |     patch("4a531bb.patch", when="@:2.12") | ||||||
| @@ -85,6 +87,14 @@ class Glibc(AutotoolsPackage, GNUMirrorPackage): | |||||||
|     # linker flag output regex |     # linker flag output regex | ||||||
|     patch("7c8a673.patch", when="@:2.9") |     patch("7c8a673.patch", when="@:2.9") | ||||||
| 
 | 
 | ||||||
|  |     # Use AT_RANDOM provided by the kernel instead of /dev/urandom; | ||||||
|  |     # recent gcc + binutils have issues with the inline assembly in | ||||||
|  |     # the fallback code, so better to use the kernel-provided value. | ||||||
|  |     patch("965cb60.patch", when="@2.8:2.9") | ||||||
|  |     patch("965cb60-2.7.patch", when="@2.7") | ||||||
|  |     patch("965cb60-2.6.patch", when="@2.6") | ||||||
|  |     patch("965cb60-2.5.patch", when="@2.5") | ||||||
|  | 
 | ||||||
|     # include_next <limits.h> not working |     # include_next <limits.h> not working | ||||||
|     patch("67fbfa5.patch", when="@:2.7") |     patch("67fbfa5.patch", when="@:2.7") | ||||||
| 
 | 
 | ||||||
| @@ -95,6 +105,12 @@ def setup_build_environment(self, env): | |||||||
|             # for some reason CPPFLAGS -U_FORTIFY_SOURCE is not enough, it has to be CFLAGS |             # for some reason CPPFLAGS -U_FORTIFY_SOURCE is not enough, it has to be CFLAGS | ||||||
|             env.append_flags("CPPFLAGS", "-U_FORTIFY_SOURCE") |             env.append_flags("CPPFLAGS", "-U_FORTIFY_SOURCE") | ||||||
|             env.append_flags("CFLAGS", "-O2 -g -fno-stack-protector -U_FORTIFY_SOURCE") |             env.append_flags("CFLAGS", "-O2 -g -fno-stack-protector -U_FORTIFY_SOURCE") | ||||||
|  |         if self.spec.satisfies("@:2.9"): | ||||||
|  |             # missing defines in elf.h after 965cb60.patch | ||||||
|  |             env.append_flags("CFLAGS", "-DAT_BASE_PLATFORM=24 -DAT_RANDOM=25") | ||||||
|  |         if self.spec.satisfies("@:2.6"): | ||||||
|  |             # change of defaults in gcc 10 | ||||||
|  |             env.append_flags("CFLAGS", "-fcommon") | ||||||
|         if self.spec.satisfies("@2.5"): |         if self.spec.satisfies("@2.5"): | ||||||
|             env.append_flags("CFLAGS", "-fgnu89-inline") |             env.append_flags("CFLAGS", "-fgnu89-inline") | ||||||
| 
 | 
 | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Harmen Stoppels
					Harmen Stoppels