summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2013-08-16 17:51:38 -0400
committerRich Felker <dalias@aerifal.cx>2013-08-16 17:51:38 -0400
commit82fa6b43b367d047e89cfa5505ad718253fbb693 (patch)
treee49cb6c2694a0be5ded8eaf0d913da9ba11a9fe3
parent63893d3ff1f9383ba3ce63a19b7de74ace319d77 (diff)
downloadmusl-82fa6b43b367d047e89cfa5505ad718253fbb693.tar.gz
fix atomicity and other issues installing dynamic linker symlink
ln -sf is non-atomic; it unlinks the destination first. instead, make a temporary link and rename it into place. this commit also fixes some of the dependency tracking behavior for the link. depending on the directory it's to be installed in is not reasonable; it causes a new link to be attempted if the library directory has been modified, but does not attempt to make a new link just because libc has been updated. instead, depend on the target to be linked to. this will ensure that, if prefix has changed but syslibdir has not, the link will be updated to point to the new prefix.
-rw-r--r--Makefile8
1 files changed, 3 insertions, 5 deletions
diff --git a/Makefile b/Makefile
index 33c2de1b..7e634dad 100644
--- a/Makefile
+++ b/Makefile
@@ -155,11 +155,9 @@ $(DESTDIR)$(includedir)/bits/%: arch/$(ARCH)/bits/%
$(DESTDIR)$(includedir)/%: include/%
install -D -m 644 $< $@
-$(DESTDIR)$(LDSO_PATHNAME): $(DESTDIR)$(syslibdir)
- ln -sf $(libdir)/libc.so $@ || true
-
-$(DESTDIR)$(syslibdir):
- install -d -m 755 $(DESTDIR)$(syslibdir)
+$(DESTDIR)$(LDSO_PATHNAME): $(DESTDIR)$(libdir)/libc.so
+ test -d $(DESTDIR)$(syslibdir) || install -d -m 755 $(DESTDIR)$(syslibdir) || true
+ { ln -sf $(libdir)/libc.so $@.tmp.$$$$ && mv -f $@.tmp.$$$$ $@ ; } || true
install-libs: $(ALL_LIBS:lib/%=$(DESTDIR)$(libdir)/%) $(if $(SHARED_LIBS),$(DESTDIR)$(LDSO_PATHNAME),)