summary refs log tree commit diff
path: root/Makerules
diff options
context:
space:
mode:
Diffstat (limited to 'Makerules')
-rw-r--r--Makerules24
1 files changed, 21 insertions, 3 deletions
diff --git a/Makerules b/Makerules
index 563c528b93..27e6a3a378 100644
--- a/Makerules
+++ b/Makerules
@@ -103,8 +103,8 @@ vpath %.x $(subst $(empty) ,:,$(strip $(common-objpfx) $(objpfx) \
 # being included individually by a subdir makefile (hurd/Makefile needs this).
 in-Makerules := yes
 
-ifndef avoid-generated
 -include $(+sysdir_pfx)sysd-Makefile
+ifndef avoid-generated
 ifneq ($(sysd-Makefile-sysdirs),$(config-sysdirs))
 sysd-Makefile-force = FORCE
 FORCE:
@@ -383,15 +383,25 @@ LDLIBS-c.so = $(gnulib)
 LDFLAGS-c.so += -e __libc_main
 # We have a versioning file for libc.so.
 libc-map = $(..)libc.map
+# Pre-link the objects of libc_pic.a so that we can locally resolve
+# COMMON symbols before we link against ld.so.  This is because ld.so
+# contains some of libc_pic.a already, which will prevent the COMMONs
+# from being allocated in libc.so, which introduces evil dependencies
+# between libc.so and ld.so, which can make it impossible to upgrade.
+$(common-objpfx)libc_pic.os: $(common-objpfx)libc_pic.a
+	$(LINK.o) -nostdlib -nostartfiles -r -o $@ \
+	-Wl,-d -Wl,--whole-archive $^
 # Use our own special initializer and finalizer files for libc.so.
 $(common-objpfx)libc.so: $(elfobjdir)/soinit.os \
-			 $(common-objpfx)libc_pic.a \
+			 $(common-objpfx)libc_pic.os \
 			 $(elfobjdir)/sofini.os $(elfobjdir)/ld.so \
 			 $(libc-map)
 	$(build-shlib)
+common-generated += libc.so
 ifdef libc.so-version
 $(common-objpfx)libc.so$(libc.so-version): $(common-objpfx)libc.so
 	$(make-link)
+common-generated += libc.so$(libc.so-version)
 endif
 endif
 
@@ -719,6 +729,7 @@ endef
 object-suffixes-left := $(versioned)
 include $(o-iterator)
 
+generated += $(foreach o,$(versioned),$o$($o-version))
 
 ifeq (,$($(subdir)-version))
 define o-iterator-doit
@@ -824,10 +835,15 @@ install-others-nosubdir: $(install-others)
 install-%:: install-%-nosubdir ;
 
 .PHONY: install install-no-libc.a-nosubdir
+ifeq ($(build-programs),yes)
 install-no-libc.a-nosubdir: install-headers-nosubdir install-data-nosubdir\
 			    install-bin-nosubdir install-lib-nosubdir	\
 			    install-others-nosubdir install-rootsbin-nosubdir \
 			    install-sbin-nosubdir
+else
+install-no-libc.a-nosubdir: install-headers-nosubdir install-data-nosubdir\
+			    install-lib-nosubdir install-others-nosubdir
+endif
 install: install-no-libc.a-nosubdir
 
 # Command to compile $< in $(objdir) using the native libraries.
@@ -880,7 +896,9 @@ common-mostlyclean:
 				     $(addsuffix .o,$(tests) $(test-srcs) \
 						    $(others)) \
 				     $(addsuffix .out,$(tests) $(test-srcs)))
-	-rm -f $(addprefix $(objpfx),$(extra-objs) $(install-lib))
+	-rm -f $(addprefix $(objpfx),$(extra-objs) $(install-lib) \
+				     $(install-lib.so) \
+				     $(install-lib.so:%.so=%_pic.a))
 	-rm -f core $(common-objpfx)stub-$(subdir)
 	$(rmobjs)
 define rmobjs