diff --git a/dlfcn/Makefile b/dlfcn/Makefile
index 6bbfbb8344..13a2684b30 100644
--- a/dlfcn/Makefile
+++ b/dlfcn/Makefile
@@ -35,6 +35,7 @@ routines = \
   libc_dlerror_result \
 
 extra-libs-others := libdl
+not-df-gnu-unique := libdl
 
 libdl-shared-only-routines += libdl-compat
 
diff --git a/extra-lib.mk b/extra-lib.mk
index 9051958ec0..3f17017879 100644
--- a/extra-lib.mk
+++ b/extra-lib.mk
@@ -101,11 +101,36 @@ $(objpfx)$(lib).so: $(firstword $($(lib)-map) \
 				$(addprefix $(common-objpfx), \
 					    $(filter $(lib).map, \
 						     $(version-maps))))
+
+############################################################################
+# the following have had all functional contents merged back into libc and
+# are no longer considered part of the implicitly DF_GNU_1_UNIQUE cluster:
+#    nptl/libpthread htl/libpthread dlfcn/libdl login/libutil resolv/libanl
+
+# NOTE: the mechanisms are reversed depending on linker support:
+# If linker support is present, libraries get the unique flag by default and we
+# _suppress_ this with the -z nounique parameter.
+# If linker support is absent then the flag is _added_ via a hacked up extra
+# object from the elf/ subdir to those DSOs that need it.
+
+# The not-df-gnu-unique variable should contain a space separated list of
+# stub library names (eg pthread for libpthread.so) of extra-libs which should
+# NOT have the uniqueness flag.
+# It should be set in the Makefile of the relevant subdir:
 ifneq ($(ld-zunique),yes)
+ifeq (,$(strip $(filter $(not-df-gnu-unique),$(lib))))
 $(objpfx)$(lib).so: $(common-objpfx)/elf/dynamic-notes.os
+else
 endif
+else
+ifneq (,$(strip $(filter $(not-df-gnu-unique),$(lib))))
+LDFLAGS-$(patsubst lib%,%,$(lib)).so += -Wl,-z,nounique
+else
 endif
+endif
+############################################################################
 
+endif
 endif
 
 # This will define `libof-ROUTINE := LIB' for each of the routines.
diff --git a/htl/Makefile b/htl/Makefile
index c2a25dcd79..9a04ba2a5f 100644
--- a/htl/Makefile
+++ b/htl/Makefile
@@ -169,6 +169,7 @@ shared-only-routines = forward
 
 extra-libs := libpthread
 extra-libs-others := $(extra-libs)
+not-df-gnu-unique := libpthread
 install-lib := libpthread.so
 install-lib-ldscripts := libpthread_syms.a
 
@@ -202,10 +203,8 @@ $(inst_libdir)/libpthread_syms.a: $(srcdir)/libpthread_syms.a $(+force)
 libc-link.so = $(common-objpfx)libc.so
 
 extra-B-pthread.so = -B$(common-objpfx)htl/
+# Turn off DF_GNU_1_UNIQUE for libpthread now that it's a stub.
 LDFLAGS-pthread.so = -Wl,--enable-new-dtags,-z,nodelete,-z,initfirst
-ifeq ($(ld-zunique),yes)
-LDFLAGS-pthread.so += -Wl,-z,unique
-endif
 
 include ../Rules
 
diff --git a/login/Makefile b/login/Makefile
index 4e6b97734d..703b3f3bd0 100644
--- a/login/Makefile
+++ b/login/Makefile
@@ -50,6 +50,7 @@ ifeq ($(have-GLIBC_2.33),yes)
 # Empty compatibility library for old binaries.
 extra-libs      := libutil
 extra-libs-others := $(extra-libs)
+not-df-gnu-unique := libutil
 libutil-routines := libutil-compat
 libutil-shared-only-routines := libutil-compat
 
diff --git a/nptl/Makefile b/nptl/Makefile
index bd9bc193e6..015cbd0b96 100644
--- a/nptl/Makefile
+++ b/nptl/Makefile
@@ -27,6 +27,7 @@ headers := pthread.h semaphore.h bits/semaphore.h \
 
 extra-libs := libpthread
 extra-libs-others := $(extra-libs)
+not-df-gnu-unique := libpthread
 
 routines = \
   alloca_cutoff \
@@ -376,9 +377,6 @@ CPPFLAGS-tst-pthread-gdb-attach-static.c := \
 tst-pthread-gdb-attach-no-pie = yes
 
 LDFLAGS-pthread.so = -Wl,--enable-new-dtags,-z,nodelete,-z,initfirst
-ifeq ($(ld-zunique),yes)
-LDFLAGS-pthread.so += -Wl,-z,unique
-endif
 
 tests += tst-cancelx7 tst-cancelx17 tst-cleanupx4
 
diff --git a/resolv/Makefile b/resolv/Makefile
index 59e599535c..56afc5c279 100644
--- a/resolv/Makefile
+++ b/resolv/Makefile
@@ -77,8 +77,10 @@ tests-internal += tst-inet_aton_exact
 generate := mtrace-tst-leaks.out tst-leaks.mtrace tst-leaks2.mtrace
 
 extra-libs := libresolv libnss_dns
+not-df-gnu-unique :=
 ifeq ($(have-thread-library),yes)
 extra-libs += libanl
+not-df-gnu-unique += libanl
 routines += gai_sigqueue
 
 tests += \
