diff --git a/Makefile b/Makefile
index 70875b53aad4fd90bd2aab9ea132f30d58b550c7..188269d700629acdf217784239b1313bd3f26222 100644
--- a/Makefile
+++ b/Makefile
@@ -30,11 +30,10 @@ SYSLIBFILE       = lib$(SYSLIBNAME)$(SOEXT)
 DLIBPATH         = $(LIBDIR)/$(DLIBFILE)
 SLIBPATH         = $(LIBDIR)/$(SLIBFILE)
 SYSLIBPATH       = $(LIBDIR)/$(SYSLIBFILE)
-BUILDDLIBDIR     = lib
-BUILDSLIBDIR     = lib
-BUILDDLIBPATH    = $(BUILDDLIBDIR)/$(DLIBFILE)
-BUILDSLIBPATH    = $(BUILDSLIBDIR)/$(SLIBFILE)
-BUILDSYSLIBPATH  = $(BUILDDLIBDIR)/$(SYSLIBFILE)
+BUILDLIBDIR      = lib
+BUILDDLIBPATH    = $(BUILDLIBDIR)/$(DLIBFILE)
+BUILDSLIBPATH    = $(BUILDLIBDIR)/$(SLIBFILE)
+BUILDSYSLIBPATH  = $(BUILDLIBDIR)/$(SYSLIBFILE)
 SOCURVERSION    ?= 1.0
 SOCOMPATVERSION ?= 1.0
 BUILDDLIBFLAGS   = -dynamiclib -headerpad_max_install_names \
@@ -98,9 +97,12 @@ DLIBOBJEXT       = .dl.o
 SLIBOBJEXT       = .o
 DLIBOBJS        := $(patsubst %.c,%$(DLIBOBJEXT),$(LIBSRCS))
 MULTIDLIBOBJS   := $(patsubst %.c,%$(DLIBOBJEXT),$(MULTISRCS))
+ALLDLIBOBJS     := $(DLIBOBJS) $(MULTIDLIBOBJS)
 SLIBOBJS        := $(patsubst %.c,%$(SLIBOBJEXT),$(LIBSRCS))
 MULTISLIBOBJS   := $(patsubst %.c,%$(SLIBOBJEXT),$(MULTISRCS))
+ALLSLIBOBJS     := $(SLIBOBJS) $(MULTISLIBOBJS)
 ADDOBJS         := $(patsubst %.c,%$(SLIBOBJEXT),$(ADDSRCS))
+ALLSYSLIBOBJS   := $(ALLDLIBOBJS) $(ADDOBJS)
 
 # Defs for filtering out empty object files
 #
@@ -136,7 +138,7 @@ DARWINRUNS      := $(patsubst \
 TESTDIR          = test
 TESTNAMEPREFIX   = $(TESTDIR)/test_
 TESTRUNPREFIX    = run_
-TESTLDFLAGS      = -L$(BUILDDLIBDIR) $(ALLLDFLAGS)
+TESTLDFLAGS      = -L$(BUILDLIBDIR) $(ALLLDFLAGS)
 TESTLIBS         = -l$(LIBNAME)
 TESTSRCS_C      := $(wildcard $(TESTNAMEPREFIX)*.c)
 TESTOBJS_C      := $(patsubst %.c,%.o,$(TESTSRCS_C))
@@ -300,30 +302,33 @@ $(SLIBOBJS): %$(SLIBOBJEXT): %.c $(ALLHEADERS)
 $(ADDOBJS): %$(SLIBOBJEXT): %.c $(ALLHEADERS)
 	$(CC) -c -I$(SRCINCDIR) $(ALLCFLAGS) $(SLIBCFLAGS) $< -o $@
 
-dlibobjs: $(DLIBOBJS) $(MULTIDLIBOBJS)
+dlibobjs: $(ALLDLIBOBJS)
 
-syslibobjs: $(DLIBOBJS) $(MULTIDLIBOBJS) $(ADDOBJS)
+syslibobjs: $(ALLSYSLIBOBJS)
 
-slibobjs: $(SLIBOBJS) $(MULTISLIBOBJS)
+slibobjs: $(ALLSLIBOBJS)
 
 allobjs: dlibobjs slibobjs syslibobjs
 
-$(SOBJLIST): $(SLIBOBJS) $(MULTISLIBOBJS)
+# Create a list of nonempty static object files.
+$(SOBJLIST): $(ALLSLIBOBJS)
 	$(CC) -c $(ALLCFLAGS) $(SLIBCFLAGS) -xc /dev/null -o $(EMPTYSOBJ)
 	for f in $^; do cmp -s $(EMPTYSOBJ) $$f || echo $$f; done > $@
 
-$(BUILDDLIBPATH): $(DLIBOBJS) $(MULTIDLIBOBJS)
-	$(MKINSTALLDIRS) $(BUILDDLIBDIR)
-	$(CC) $(BUILDDLIBFLAGS) $(ALLLDFLAGS) $^ -o $@
+# Make the directories separate targets to avoid collisions in parallel builds.
+$(BUILDLIBDIR) $(DESTDIR)$(LIBDIR):
+	$(MKINSTALLDIRS) $@
 
-$(BUILDSYSLIBPATH): $(DLIBOBJS) $(MULTIDLIBOBJS) $(ADDOBJS)
-	$(MKINSTALLDIRS) $(BUILDDLIBDIR)
-	$(CC) $(BUILDSYSLIBFLAGS) $(ALLLDFLAGS) $(SYSREEXPORTFLAG) $^ -o $@
+$(BUILDDLIBPATH): $(ALLDLIBOBJS) $(BUILDLIBDIR)
+	$(CC) $(BUILDDLIBFLAGS) $(ALLLDFLAGS) $(ALLDLIBOBJS) -o $@
 
-$(BUILDSLIBPATH): $(SOBJLIST)
-	$(MKINSTALLDIRS) $(BUILDSLIBDIR)
+$(BUILDSYSLIBPATH): $(ALLSYSLIBOBJS) $(BUILDLIBDIR)
+	$(CC) $(BUILDSYSLIBFLAGS) $(ALLLDFLAGS) $(SYSREEXPORTFLAG) \
+	      $(ALLSYSLIBOBJS) -o $@
+
+$(BUILDSLIBPATH): $(SOBJLIST) $(BUILDLIBDIR)
 	$(RM) $@
-	$(AR) $(BUILDSLIBFLAGS) $@ $$(cat $^)
+	$(AR) $(BUILDSLIBFLAGS) $@ $$(cat $<)
 
 $(TESTOBJS_C): %.o: %.c $(ALLHEADERS)
 	$(CC) -c -std=c99 -I$(SRCINCDIR) $(ALLCFLAGS) $< -o $@
@@ -440,18 +445,15 @@ install-headers:
 
 install-lib: install-dlib install-slib install-syslib
 
-install-dlib: $(BUILDDLIBPATH)
-	$(MKINSTALLDIRS) $(DESTDIR)$(LIBDIR)
+install-dlib: $(BUILDDLIBPATH) $(DESTDIR)$(LIBDIR)
 	$(INSTALL_PROGRAM) $(BUILDDLIBPATH) $(DESTDIR)$(LIBDIR)
 	$(POSTINSTALL) -id $(DLIBPATH) $(DESTDIR)$(DLIBPATH)
 
-install-syslib: $(BUILDSYSLIBPATH)
-	$(MKINSTALLDIRS) $(DESTDIR)$(LIBDIR)
+install-syslib: $(BUILDSYSLIBPATH) $(DESTDIR)$(LIBDIR)
 	$(INSTALL_PROGRAM) $(BUILDSYSLIBPATH) $(DESTDIR)$(LIBDIR)
 	$(POSTINSTALL) -id $(SYSLIBPATH) $(DESTDIR)$(SYSLIBPATH)
 
-install-slib: $(BUILDSLIBPATH)
-	$(MKINSTALLDIRS) $(DESTDIR)$(LIBDIR)
+install-slib: $(BUILDSLIBPATH) $(DESTDIR)$(LIBDIR)
 	$(INSTALL_DATA) $(BUILDSLIBPATH) $(DESTDIR)$(LIBDIR)
 
 install-tiger: $(TIGERBINS)
@@ -475,7 +477,7 @@ test_clean: xtest_clean $(MANRUNPREFIX)clean
 clean: $(MANRUNPREFIX)clean test_clean
 	$(RM) $(foreach D,$(SRCDIR),$D/*.o $D/*.o.* $D/*.d)
 	$(RM) $(BUILDDLIBPATH) $(BUILDSLIBPATH) $(BUILDSYSLIBPATH) $(TESTPRGS) test/test_cmath_* test/test_faccessat_setuid
-	@$(RMDIR) $(BUILDDLIBDIR) $(BUILDSLIBDIR)
+	@$(RMDIR) $(BUILDLIBDIR)
 
 .PHONY: all dlib syslib slib clean check test test_cmath xtest test_static
 .PHONY: $(TESTRUNS) $(XTESTRUNS) $(MANTESTRUNS)