summaryrefslogtreecommitdiff
path: root/share
diff options
context:
space:
mode:
authorAlex Richardson <arichardson@FreeBSD.org>2020-11-26 17:37:27 +0000
committerAlex Richardson <arichardson@FreeBSD.org>2020-11-26 17:37:27 +0000
commitdabbf11f97b43ced7dd218eba5961c40cc7b7deb (patch)
treed5276f2aac322d17c6a31a62a5fa42ed6313ceb6 /share
parentacf87920672f88e8bed39b758a5eb2e716548652 (diff)
downloadsrc-test2-dabbf11f97b43ced7dd218eba5961c40cc7b7deb.tar.gz
src-test2-dabbf11f97b43ced7dd218eba5961c40cc7b7deb.zip
bsd.lib.mk: Work around build system raciness
We are seeing regular build failures due to libc.so being installed again and another parallel make job tries to read the partially written libc.so at the same time. When building with -j32 or higher this almost always happens on the first clean build (subsequent incremental builds always work fine). Using -S should "fix" the "section header table goes past the end of the file: e_shoff = 0x..." errors that have started to plague our builds. We originally thought this only affected CheriBSD, but I just got the same error while building the latest upstream FreeBSD. The real fix should be to not install libraries twice, but until then this workaround is needed. Original patch by jrtc27@, I only made some minor changes to the comment. Obtained from: CheriBSD (https://github.com/CTSRD-CHERI/cheribsd/commit/49837edd3efd5d02a1b120c47f00cfc2d59a9a8e) Reviewed By: markj, bdrewery Differential Revision: https://reviews.freebsd.org/D27102
Notes
Notes: svn path=/head/; revision=368071
Diffstat (limited to 'share')
-rw-r--r--share/mk/bsd.lib.mk12
1 files changed, 11 insertions, 1 deletions
diff --git a/share/mk/bsd.lib.mk b/share/mk/bsd.lib.mk
index ce29fcdcaa65..3d429a6b5b8a 100644
--- a/share/mk/bsd.lib.mk
+++ b/share/mk/bsd.lib.mk
@@ -422,7 +422,17 @@ SHLINSTALLFLAGS+= -fschg
# Install libraries with -S to avoid risk of modifying in-use libraries when
# installing to a running system. It is safe to avoid this for NO_ROOT builds
# that are only creating an image.
-.if !defined(NO_SAFE_LIBINSTALL) && !defined(NO_ROOT)
+#
+# XXX: Since Makefile.inc1 ends up building lib/libc both as part of
+# _startup_libs and as part of _generic_libs it ends up getting installed a
+# second time during the parallel build, and although the .WAIT in lib/Makefile
+# stops that mattering for lib, other directories like secure/lib are built in
+# parallel at the top level and are unaffected by that, so can sometimes race
+# with the libc.so.7 reinstall and see a missing or corrupt file. Ideally the
+# build system would be fixed to not build/install libc to WORLDTMP the second
+# time round, but for now using -S ensures the install is atomic and thus we
+# never see a broken intermediate state, so use it even for NO_ROOT builds.
+.if !defined(NO_SAFE_LIBINSTALL) #&& !defined(NO_ROOT)
SHLINSTALLFLAGS+= -S
SHLINSTALLSYMLINKFLAGS+= -S
.endif