diff --git a/Makefile.pre.in b/Makefile.pre.in
index e2253d3e35b3e6..29c2708f58b10d 100644
--- a/Makefile.pre.in
+++ b/Makefile.pre.in
@@ -32,6 +32,7 @@ srcdir=		@srcdir@
 VPATH=		@srcdir@
 abs_srcdir=	@abs_srcdir@
 abs_builddir=	@abs_builddir@
+UNIQMODLIBS=    @UNIQMODLIBS@
 
 
 CC=		@CC@
@@ -3381,21 +3382,28 @@ MODULE__CTYPES_MALLOC_CLOSURE=@MODULE__CTYPES_MALLOC_CLOSURE@
 MODULE__DECIMAL_DEPS=$(srcdir)/Modules/_decimal/docstrings.h @LIBMPDEC_INTERNAL@
 MODULE__ELEMENTTREE_DEPS=$(srcdir)/Modules/pyexpat.c @LIBEXPAT_INTERNAL@
 MODULE__HASHLIB_DEPS=@LIBHASHLIB_INTERNAL@
+MODULE__HASHLIB_RULE_LDFLAGS=@LIBHASHLIB_INTERNAL_RULE_LDFLAGS@
 MODULE__IO_DEPS=$(srcdir)/Modules/_io/_iomodule.h
 
 # HACL*-based cryptographic primitives
 MODULE__MD5_DEPS=$(MODULE__HASHLIB_DEPS) $(LIBHACL_MD5_HEADERS) $(LIBHACL_MD5_LIB_@LIBHACL_LDEPS_LIBTYPE@)
 MODULE__MD5_LDEPS=$(LIBHACL_MD5_LIB_@LIBHACL_LDEPS_LIBTYPE@)
+MODULE__MD5_RULE_LDFLAGS=@LIBHASHLIB_INTERNAL_RULE_LDFLAGS@
 MODULE__SHA1_DEPS=$(MODULE__HASHLIB_DEPS) $(LIBHACL_SHA1_HEADERS) $(LIBHACL_SHA1_LIB_@LIBHACL_LDEPS_LIBTYPE@)
 MODULE__SHA1_LDEPS=$(LIBHACL_SHA1_LIB_@LIBHACL_LDEPS_LIBTYPE@)
+MODULE__SHA1_RULE_LDFLAGS=@LIBHASHLIB_INTERNAL_RULE_LDFLAGS@
 MODULE__SHA2_DEPS=$(MODULE__HASHLIB_DEPS) $(LIBHACL_SHA2_HEADERS) $(LIBHACL_SHA2_LIB_@LIBHACL_LDEPS_LIBTYPE@)
 MODULE__SHA2_LDEPS=$(LIBHACL_SHA2_LIB_@LIBHACL_LDEPS_LIBTYPE@)
+MODULE__SHA2_RULE_LDFLAGS=@LIBHASHLIB_INTERNAL_RULE_LDFLAGS@
 MODULE__SHA3_DEPS=$(MODULE__HASHLIB_DEPS) $(LIBHACL_SHA3_HEADERS) $(LIBHACL_SHA3_LIB_@LIBHACL_LDEPS_LIBTYPE@)
 MODULE__SHA3_LDEPS=$(LIBHACL_SHA3_LIB_@LIBHACL_LDEPS_LIBTYPE@)
+MODULE__SHA3_RULE_LDFLAGS=@LIBHASHLIB_INTERNAL_RULE_LDFLAGS@
 MODULE__BLAKE2_DEPS=$(MODULE__HASHLIB_DEPS) $(LIBHACL_BLAKE2_HEADERS) $(LIBHACL_BLAKE2_LIB_@LIBHACL_LDEPS_LIBTYPE@)
 MODULE__BLAKE2_LDEPS=$(LIBHACL_BLAKE2_LIB_@LIBHACL_LDEPS_LIBTYPE@)
+MODULE__BLAKE2_RULE_LDFLAGS=@LIBHASHLIB_INTERNAL_RULE_LDFLAGS@
 MODULE__HMAC_DEPS=$(MODULE__HASHLIB_DEPS) $(LIBHACL_HMAC_HEADERS) $(LIBHACL_HMAC_LIB_@LIBHACL_LDEPS_LIBTYPE@)
 MODULE__HMAC_LDEPS=$(LIBHACL_HMAC_LIB_@LIBHACL_LDEPS_LIBTYPE@)
+MODULE__HMAC_RULE_LDFLAGS=@LIBHASHLIB_INTERNAL_RULE_LDFLAGS@
 
 MODULE__SOCKET_DEPS=$(srcdir)/Modules/socketmodule.h $(srcdir)/Modules/addrinfo.h $(srcdir)/Modules/getaddrinfo.c $(srcdir)/Modules/getnameinfo.c
 MODULE__SSL_DEPS=$(srcdir)/Modules/_ssl.h $(srcdir)/Modules/_ssl/cert.c $(srcdir)/Modules/_ssl/debughelpers.c $(srcdir)/Modules/_ssl/misc.c $(srcdir)/Modules/_ssl_data_111.h $(srcdir)/Modules/_ssl_data_300.h $(srcdir)/Modules/socketmodule.h
diff --git a/Modules/_hashlib/hashlib_buffer.h b/Modules/_hashlib/hashlib_buffer.h
index 809f19884f41b7..d6457eaa60960f 100644
--- a/Modules/_hashlib/hashlib_buffer.h
+++ b/Modules/_hashlib/hashlib_buffer.h
@@ -14,7 +14,7 @@
  *
  * The symbol is exported for '_hashlib' and HACL*-based extension modules.
  */
-PyAPI_FUNC(int)
+extern int
 _Py_hashlib_data_argument(PyObject **res, PyObject *data, PyObject *string);
 
 /*
@@ -25,7 +25,7 @@ _Py_hashlib_data_argument(PyObject **res, PyObject *data, PyObject *string);
  *
  * The symbol is exported for '_hashlib' and HACL*-based extension modules.
  */
-PyAPI_FUNC(int)
+extern int
 _Py_hashlib_get_buffer_view(PyObject *obj, Py_buffer *view);
 
 /*
diff --git a/Modules/makesetup b/Modules/makesetup
index f6cf695b457cbf..ece8466eaba548 100755
--- a/Modules/makesetup
+++ b/Modules/makesetup
@@ -111,6 +111,7 @@ sed -e 's/[ 	]*#.*//' -e '/^[ 	]*$/d' |
 	SHAREDMODS=
 	OBJS=
 	LIBS=
+	UNIQMODLIBS=
 	LOCALLIBS=
 	BASELIBS=
 	while read line
@@ -276,7 +277,7 @@ sed -e 's/[ 	]*#.*//' -e '/^[ 	]*$/d' |
 				;;
 			esac
 			rule="$file: $objs \$(MODULE_${mods_upper}_LDEPS)"
-			rule="$rule; \$(BLDSHARED) $objs $libs \$(LIBPYTHON) -o $file"
+			rule="$rule; \$(BLDSHARED) $objs $libs \$(MODULE_${mods_upper}_RULE_LDFLAGS) \$(LIBPYTHON) -o $file"
 			echo "$rule" >>$rulesf
 		done
 	done
@@ -290,7 +291,7 @@ sed -e 's/[ 	]*#.*//' -e '/^[ 	]*$/d' |
 	yes)	BASELIBS=$LIBS;;
 	*)	LOCALLIBS=$LIBS;;
 	esac
-	LIBS='$(LOCALMODLIBS) $(BASEMODLIBS)'
+	LIBS='$(LOCALMODLIBS) $(BASEMODLIBS) $(UNIQMODLIBS)'
 	DEFS="BASEMODLIBS=$BASELIBS$NL$DEFS"
 	DEFS="LOCALMODLIBS=$LOCALLIBS$NL$DEFS"
 
@@ -332,6 +333,7 @@ sed -e 's/[ 	]*#.*//' -e '/^[ 	]*$/d' |
 		echo "s%_MODDISABLED_NAMES_%$DISABLED%" >>$sedf
 		echo "s%_MODOBJS_%$OBJS%" >>$sedf
 		echo "s%_MODLIBS_%$LIBS%" >>$sedf
+		echo "s%_UNIQMODLIBS_%$UNIQMODLIBS%" >>$sedf
 		echo "/Definitions added by makesetup/r $sedr" >>$sedf
 		sed -f $sedf $makepre >Makefile
 		cat $rulesf >>Makefile
diff --git a/PCbuild/_hashlib.vcxproj b/PCbuild/_hashlib.vcxproj
index cfb43cee935b86..70f39d35932a77 100644
--- a/PCbuild/_hashlib.vcxproj
+++ b/PCbuild/_hashlib.vcxproj
@@ -99,6 +99,7 @@
   
   
     
+    
   
   
     
diff --git a/PCbuild/_hashlib.vcxproj.filters b/PCbuild/_hashlib.vcxproj.filters
index d465d92a956eda..97188a87f34b77 100644
--- a/PCbuild/_hashlib.vcxproj.filters
+++ b/PCbuild/_hashlib.vcxproj.filters
@@ -12,6 +12,9 @@
     
       Source Files
     
+    
+      Source Files
+    
   
   
     
diff --git a/configure b/configure
index 0e7aefed5ee62d..047888d45801a8 100755
--- a/configure
+++ b/configure
@@ -726,6 +726,7 @@ LIBHACL_SIMD128_FLAGS
 LIBHACL_LDFLAGS
 LIBHACL_CFLAGS
 LIBHASHLIB_INTERNAL
+LIBHASHLIB_INTERNAL_RULE_LDFLAGS
 LIBHASHLIB_INTERNAL_CFLAGS
 MODULE_UNICODEDATA_FALSE
 MODULE_UNICODEDATA_TRUE
@@ -1038,6 +1039,7 @@ GITBRANCH
 GITTAG
 GITVERSION
 BASECPPFLAGS
+UNIQMODLIBS
 target_alias
 host_alias
 build_alias
@@ -3561,6 +3563,9 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 
 
+UNIQMODLIBS=""
+
+
 
 
 
@@ -14153,6 +14158,7 @@ fi
 save_CPPFLAGS=$CPPFLAGS
 save_LDFLAGS=$LDFLAGS
 save_LIBS=$LIBS
+save_UNIQMODLIBS=$UNIQMODLIBS
 
 
         CPPFLAGS="$CPPFLAGS $LIBUUID_CFLAGS"
@@ -14285,6 +14291,7 @@ CFLAGS=$save_CFLAGS
 CPPFLAGS=$save_CPPFLAGS
 LDFLAGS=$save_LDFLAGS
 LIBS=$save_LIBS
+UNIQMODLIBS=$save_UNIQMODLIBS
 
 
 
@@ -14297,6 +14304,7 @@ printf "%s\n" "no" >&6; }
 save_CPPFLAGS=$CPPFLAGS
 save_LDFLAGS=$LDFLAGS
 save_LIBS=$LIBS
+save_UNIQMODLIBS=$UNIQMODLIBS
 
 
         CPPFLAGS="$CPPFLAGS $LIBUUID_CFLAGS"
@@ -14429,6 +14437,7 @@ CFLAGS=$save_CFLAGS
 CPPFLAGS=$save_CPPFLAGS
 LDFLAGS=$save_LDFLAGS
 LIBS=$save_LIBS
+UNIQMODLIBS=$save_UNIQMODLIBS
 
 
 
@@ -14531,6 +14540,7 @@ printf %s "checking if uuid_generate_time_safe() node value is stable... " >&6;
 save_CPPFLAGS=$CPPFLAGS
 save_LDFLAGS=$LDFLAGS
 save_LIBS=$LIBS
+save_UNIQMODLIBS=$UNIQMODLIBS
 
 
   # Be sure to add the extra include path if we used pkg-config
@@ -14591,12 +14601,14 @@ CFLAGS=$save_CFLAGS
 CPPFLAGS=$save_CPPFLAGS
 LDFLAGS=$save_LDFLAGS
 LIBS=$save_LIBS
+UNIQMODLIBS=$save_UNIQMODLIBS
 
 
   save_CFLAGS=$CFLAGS
 save_CPPFLAGS=$CPPFLAGS
 save_LDFLAGS=$LDFLAGS
 save_LIBS=$LIBS
+save_UNIQMODLIBS=$UNIQMODLIBS
 
 
   # Be sure to add the extra include path if we used pkg-config
@@ -14657,6 +14669,7 @@ CFLAGS=$save_CFLAGS
 CPPFLAGS=$save_CPPFLAGS
 LDFLAGS=$save_LDFLAGS
 LIBS=$save_LIBS
+UNIQMODLIBS=$save_UNIQMODLIBS
 
 
   if test -n "$py_cv_uuid_node1" -a "$py_cv_uuid_node1" = "$py_cv_uuid_node2"
@@ -15195,6 +15208,7 @@ then :
 save_CPPFLAGS=$CPPFLAGS
 save_LDFLAGS=$LDFLAGS
 save_LIBS=$LIBS
+save_UNIQMODLIBS=$UNIQMODLIBS
 
 
     CFLAGS="-I${SDKROOT}/usr/include/ffi $CFLAGS"
@@ -15262,6 +15276,7 @@ CFLAGS=$save_CFLAGS
 CPPFLAGS=$save_CPPFLAGS
 LDFLAGS=$save_LDFLAGS
 LIBS=$save_LIBS
+UNIQMODLIBS=$save_UNIQMODLIBS
 
 
 
@@ -15333,6 +15348,7 @@ fi
 save_CPPFLAGS=$CPPFLAGS
 save_LDFLAGS=$LDFLAGS
 save_LIBS=$LIBS
+save_UNIQMODLIBS=$UNIQMODLIBS
 
 
       CPPFLAGS="$CPPFLAGS $LIBFFI_CFLAGS"
@@ -15404,6 +15420,7 @@ CFLAGS=$save_CFLAGS
 CPPFLAGS=$save_CPPFLAGS
 LDFLAGS=$save_LDFLAGS
 LIBS=$save_LIBS
+UNIQMODLIBS=$save_UNIQMODLIBS
 
 
 
@@ -15415,6 +15432,7 @@ printf "%s\n" "no" >&6; }
 save_CPPFLAGS=$CPPFLAGS
 save_LDFLAGS=$LDFLAGS
 save_LIBS=$LIBS
+save_UNIQMODLIBS=$UNIQMODLIBS
 
 
       CPPFLAGS="$CPPFLAGS $LIBFFI_CFLAGS"
@@ -15486,6 +15504,7 @@ CFLAGS=$save_CFLAGS
 CPPFLAGS=$save_CPPFLAGS
 LDFLAGS=$save_LDFLAGS
 LIBS=$save_LIBS
+UNIQMODLIBS=$save_UNIQMODLIBS
 
 
 
@@ -15536,6 +15555,7 @@ fi
 save_CPPFLAGS=$CPPFLAGS
 save_LDFLAGS=$LDFLAGS
 save_LIBS=$LIBS
+save_UNIQMODLIBS=$UNIQMODLIBS
 
 
     CFLAGS="$CFLAGS $LIBFFI_CFLAGS"
@@ -15669,6 +15689,7 @@ CFLAGS=$save_CFLAGS
 CPPFLAGS=$save_CPPFLAGS
 LDFLAGS=$save_LDFLAGS
 LIBS=$save_LIBS
+UNIQMODLIBS=$save_UNIQMODLIBS
 
 
 
@@ -15689,6 +15710,7 @@ else case e in #(
 save_CPPFLAGS=$CPPFLAGS
 save_LDFLAGS=$LDFLAGS
 save_LIBS=$LIBS
+save_UNIQMODLIBS=$UNIQMODLIBS
 
 
  CPPFLAGS="$CPPFLAGS $LIBFFI_CFLAGS"
@@ -15741,6 +15763,7 @@ CFLAGS=$save_CFLAGS
 CPPFLAGS=$save_CPPFLAGS
 LDFLAGS=$save_LDFLAGS
 LIBS=$save_LIBS
+UNIQMODLIBS=$save_UNIQMODLIBS
 
  ;;
 esac
@@ -15862,6 +15885,7 @@ then :
 save_CPPFLAGS=$CPPFLAGS
 save_LDFLAGS=$LDFLAGS
 save_LIBS=$LIBS
+save_UNIQMODLIBS=$UNIQMODLIBS
 
 
     CPPFLAGS="$CPPFLAGS $LIBMPDEC_CFLAGS"
@@ -15898,6 +15922,7 @@ CFLAGS=$save_CFLAGS
 CPPFLAGS=$save_CPPFLAGS
 LDFLAGS=$save_LDFLAGS
 LIBS=$save_LIBS
+UNIQMODLIBS=$save_UNIQMODLIBS
 
 
 fi
@@ -16117,6 +16142,7 @@ save_CFLAGS=$CFLAGS
 save_CPPFLAGS=$CPPFLAGS
 save_LDFLAGS=$LDFLAGS
 save_LIBS=$LIBS
+save_UNIQMODLIBS=$UNIQMODLIBS
 
 
   CPPFLAGS="$CPPFLAGS $LIBSQLITE3_CFLAGS"
@@ -16851,6 +16877,7 @@ CFLAGS=$save_CFLAGS
 CPPFLAGS=$save_CPPFLAGS
 LDFLAGS=$save_LDFLAGS
 LIBS=$save_LIBS
+UNIQMODLIBS=$save_UNIQMODLIBS
 
 
 
@@ -17107,6 +17134,7 @@ save_CFLAGS=$CFLAGS
 save_CPPFLAGS=$CPPFLAGS
 save_LDFLAGS=$LDFLAGS
 save_LIBS=$LIBS
+save_UNIQMODLIBS=$UNIQMODLIBS
 
 
   CPPFLAGS="$CPPFLAGS $TCLTK_CFLAGS"
@@ -17165,6 +17193,7 @@ CFLAGS=$save_CFLAGS
 CPPFLAGS=$save_CPPFLAGS
 LDFLAGS=$save_LDFLAGS
 LIBS=$save_LIBS
+UNIQMODLIBS=$save_UNIQMODLIBS
 
 
 
@@ -17174,6 +17203,7 @@ save_CFLAGS=$CFLAGS
 save_CPPFLAGS=$CPPFLAGS
 save_LDFLAGS=$LDFLAGS
 save_LIBS=$LIBS
+save_UNIQMODLIBS=$UNIQMODLIBS
 
 
   CPPFLAGS="$CPPFLAGS $GDBM_CFLAGS"
@@ -17251,6 +17281,7 @@ CFLAGS=$save_CFLAGS
 CPPFLAGS=$save_CPPFLAGS
 LDFLAGS=$save_LDFLAGS
 LIBS=$save_LIBS
+UNIQMODLIBS=$save_UNIQMODLIBS
 
 
 
@@ -17265,6 +17296,7 @@ then :
 save_CPPFLAGS=$CPPFLAGS
 save_LDFLAGS=$LDFLAGS
 save_LIBS=$LIBS
+save_UNIQMODLIBS=$UNIQMODLIBS
 
 
     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing dbm_open" >&5
@@ -17339,6 +17371,7 @@ CFLAGS=$save_CFLAGS
 CPPFLAGS=$save_CPPFLAGS
 LDFLAGS=$save_LDFLAGS
 LIBS=$save_LIBS
+UNIQMODLIBS=$save_UNIQMODLIBS
 
 
 
@@ -17436,6 +17469,7 @@ if test "$ac_cv_header_gdbm_slash_ndbm_h" = yes -o "$ac_cv_header_gdbm_dash_ndbm
 save_CPPFLAGS=$CPPFLAGS
 save_LDFLAGS=$LDFLAGS
 save_LIBS=$LIBS
+save_UNIQMODLIBS=$UNIQMODLIBS
 
 
     { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing dbm_open" >&5
@@ -17513,6 +17547,7 @@ CFLAGS=$save_CFLAGS
 CPPFLAGS=$save_CPPFLAGS
 LDFLAGS=$save_LDFLAGS
 LIBS=$save_LIBS
+UNIQMODLIBS=$save_UNIQMODLIBS
 
 
 fi
@@ -17537,6 +17572,7 @@ else case e in #(
 save_CPPFLAGS=$CPPFLAGS
 save_LDFLAGS=$LDFLAGS
 save_LIBS=$LIBS
+save_UNIQMODLIBS=$UNIQMODLIBS
 
 
       LIBS="$LIBS -ldb"
@@ -17572,6 +17608,7 @@ CFLAGS=$save_CFLAGS
 CPPFLAGS=$save_CPPFLAGS
 LDFLAGS=$save_LDFLAGS
 LIBS=$save_LIBS
+UNIQMODLIBS=$save_UNIQMODLIBS
 
 
    ;;
@@ -21757,6 +21794,7 @@ fi
 save_CPPFLAGS=$CPPFLAGS
 save_LDFLAGS=$LDFLAGS
 save_LIBS=$LIBS
+save_UNIQMODLIBS=$UNIQMODLIBS
 
 
     CPPFLAGS="$CPPFLAGS $ZLIB_CFLAGS"
@@ -21893,6 +21931,7 @@ CFLAGS=$save_CFLAGS
 CPPFLAGS=$save_CPPFLAGS
 LDFLAGS=$save_LDFLAGS
 LIBS=$save_LIBS
+UNIQMODLIBS=$save_UNIQMODLIBS
 
 
 
@@ -21904,6 +21943,7 @@ printf "%s\n" "no" >&6; }
 save_CPPFLAGS=$CPPFLAGS
 save_LDFLAGS=$LDFLAGS
 save_LIBS=$LIBS
+save_UNIQMODLIBS=$UNIQMODLIBS
 
 
     CPPFLAGS="$CPPFLAGS $ZLIB_CFLAGS"
@@ -22040,6 +22080,7 @@ CFLAGS=$save_CFLAGS
 CPPFLAGS=$save_CPPFLAGS
 LDFLAGS=$save_LDFLAGS
 LIBS=$save_LIBS
+UNIQMODLIBS=$save_UNIQMODLIBS
 
 
 
@@ -22141,6 +22182,7 @@ fi
 save_CPPFLAGS=$CPPFLAGS
 save_LDFLAGS=$LDFLAGS
 save_LIBS=$LIBS
+save_UNIQMODLIBS=$UNIQMODLIBS
 
 
     CPPFLAGS="$CPPFLAGS $BZIP2_CFLAGS"
@@ -22222,6 +22264,7 @@ CFLAGS=$save_CFLAGS
 CPPFLAGS=$save_CPPFLAGS
 LDFLAGS=$save_LDFLAGS
 LIBS=$save_LIBS
+UNIQMODLIBS=$save_UNIQMODLIBS
 
 
 
@@ -22233,6 +22276,7 @@ printf "%s\n" "no" >&6; }
 save_CPPFLAGS=$CPPFLAGS
 save_LDFLAGS=$LDFLAGS
 save_LIBS=$LIBS
+save_UNIQMODLIBS=$UNIQMODLIBS
 
 
     CPPFLAGS="$CPPFLAGS $BZIP2_CFLAGS"
@@ -22314,6 +22358,7 @@ CFLAGS=$save_CFLAGS
 CPPFLAGS=$save_CPPFLAGS
 LDFLAGS=$save_LDFLAGS
 LIBS=$save_LIBS
+UNIQMODLIBS=$save_UNIQMODLIBS
 
 
 
@@ -22389,6 +22434,7 @@ fi
 save_CPPFLAGS=$CPPFLAGS
 save_LDFLAGS=$LDFLAGS
 save_LIBS=$LIBS
+save_UNIQMODLIBS=$UNIQMODLIBS
 
 
     CPPFLAGS="$CPPFLAGS $LIBLZMA_CFLAGS"
@@ -22470,6 +22516,7 @@ CFLAGS=$save_CFLAGS
 CPPFLAGS=$save_CPPFLAGS
 LDFLAGS=$save_LDFLAGS
 LIBS=$save_LIBS
+UNIQMODLIBS=$save_UNIQMODLIBS
 
 
 
@@ -22481,6 +22528,7 @@ printf "%s\n" "no" >&6; }
 save_CPPFLAGS=$CPPFLAGS
 save_LDFLAGS=$LDFLAGS
 save_LIBS=$LIBS
+save_UNIQMODLIBS=$UNIQMODLIBS
 
 
     CPPFLAGS="$CPPFLAGS $LIBLZMA_CFLAGS"
@@ -22562,6 +22610,7 @@ CFLAGS=$save_CFLAGS
 CPPFLAGS=$save_CPPFLAGS
 LDFLAGS=$save_LDFLAGS
 LIBS=$save_LIBS
+UNIQMODLIBS=$save_UNIQMODLIBS
 
 
 
@@ -22637,6 +22686,7 @@ fi
 save_CPPFLAGS=$CPPFLAGS
 save_LDFLAGS=$LDFLAGS
 save_LIBS=$LIBS
+save_UNIQMODLIBS=$UNIQMODLIBS
 
 
     CPPFLAGS="$CPPFLAGS $LIBZSTD_CFLAGS"
@@ -22775,6 +22825,7 @@ CFLAGS=$save_CFLAGS
 CPPFLAGS=$save_CPPFLAGS
 LDFLAGS=$save_LDFLAGS
 LIBS=$save_LIBS
+UNIQMODLIBS=$save_UNIQMODLIBS
 
 
 
@@ -22786,6 +22837,7 @@ printf "%s\n" "no" >&6; }
 save_CPPFLAGS=$CPPFLAGS
 save_LDFLAGS=$LDFLAGS
 save_LIBS=$LIBS
+save_UNIQMODLIBS=$UNIQMODLIBS
 
 
     CPPFLAGS="$CPPFLAGS $LIBZSTD_CFLAGS"
@@ -22924,6 +22976,7 @@ CFLAGS=$save_CFLAGS
 CPPFLAGS=$save_CPPFLAGS
 LDFLAGS=$save_LDFLAGS
 LIBS=$save_LIBS
+UNIQMODLIBS=$save_UNIQMODLIBS
 
 
 
@@ -27024,6 +27077,7 @@ fi
 save_CPPFLAGS=$CPPFLAGS
 save_LDFLAGS=$LDFLAGS
 save_LIBS=$LIBS
+save_UNIQMODLIBS=$UNIQMODLIBS
 
 
       CPPFLAGS="$CPPFLAGS $LIBREADLINE_CFLAGS"
@@ -27102,6 +27156,7 @@ CFLAGS=$save_CFLAGS
 CPPFLAGS=$save_CPPFLAGS
 LDFLAGS=$save_LDFLAGS
 LIBS=$save_LIBS
+UNIQMODLIBS=$save_UNIQMODLIBS
 
 
 
@@ -27113,6 +27168,7 @@ printf "%s\n" "no" >&6; }
 save_CPPFLAGS=$CPPFLAGS
 save_LDFLAGS=$LDFLAGS
 save_LIBS=$LIBS
+save_UNIQMODLIBS=$UNIQMODLIBS
 
 
       CPPFLAGS="$CPPFLAGS $LIBREADLINE_CFLAGS"
@@ -27191,6 +27247,7 @@ CFLAGS=$save_CFLAGS
 CPPFLAGS=$save_CPPFLAGS
 LDFLAGS=$save_LDFLAGS
 LIBS=$save_LIBS
+UNIQMODLIBS=$save_UNIQMODLIBS
 
 
 
@@ -27275,6 +27332,7 @@ fi
 save_CPPFLAGS=$CPPFLAGS
 save_LDFLAGS=$LDFLAGS
 save_LIBS=$LIBS
+save_UNIQMODLIBS=$UNIQMODLIBS
 
 
       CPPFLAGS="$CPPFLAGS $LIBEDIT_CFLAGS"
@@ -27355,6 +27413,7 @@ CFLAGS=$save_CFLAGS
 CPPFLAGS=$save_CPPFLAGS
 LDFLAGS=$save_LDFLAGS
 LIBS=$save_LIBS
+UNIQMODLIBS=$save_UNIQMODLIBS
 
 
 
@@ -27366,6 +27425,7 @@ printf "%s\n" "no" >&6; }
 save_CPPFLAGS=$CPPFLAGS
 save_LDFLAGS=$LDFLAGS
 save_LIBS=$LIBS
+save_UNIQMODLIBS=$UNIQMODLIBS
 
 
       CPPFLAGS="$CPPFLAGS $LIBEDIT_CFLAGS"
@@ -27446,6 +27506,7 @@ CFLAGS=$save_CFLAGS
 CPPFLAGS=$save_CPPFLAGS
 LDFLAGS=$save_LDFLAGS
 LIBS=$save_LIBS
+UNIQMODLIBS=$save_UNIQMODLIBS
 
 
 
@@ -27484,6 +27545,7 @@ printf "%s\n" "$with_readline (CFLAGS: $READLINE_CFLAGS, LIBS: $READLINE_LIBS)"
 save_CPPFLAGS=$CPPFLAGS
 save_LDFLAGS=$LDFLAGS
 save_LIBS=$LIBS
+save_UNIQMODLIBS=$UNIQMODLIBS
 
 
     CPPFLAGS="$CPPFLAGS $READLINE_CFLAGS"
@@ -27883,6 +27945,7 @@ CFLAGS=$save_CFLAGS
 CPPFLAGS=$save_CPPFLAGS
 LDFLAGS=$save_LDFLAGS
 LIBS=$save_LIBS
+UNIQMODLIBS=$save_UNIQMODLIBS
 
  ;;
 esac
@@ -28596,6 +28659,7 @@ save_CFLAGS=$CFLAGS
 save_CPPFLAGS=$CPPFLAGS
 save_LDFLAGS=$LDFLAGS
 save_LIBS=$LIBS
+save_UNIQMODLIBS=$UNIQMODLIBS
 
 
   # Make sure we've got the header defines.
@@ -29631,6 +29695,7 @@ CFLAGS=$save_CFLAGS
 CPPFLAGS=$save_CPPFLAGS
 LDFLAGS=$save_LDFLAGS
 LIBS=$save_LIBS
+UNIQMODLIBS=$save_UNIQMODLIBS
 
 
 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for device files" >&5
@@ -30323,6 +30388,7 @@ save_CFLAGS=$CFLAGS
 save_CPPFLAGS=$CPPFLAGS
 save_LDFLAGS=$LDFLAGS
 save_LIBS=$LIBS
+save_UNIQMODLIBS=$UNIQMODLIBS
 
 
   { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing shm_open" >&5
@@ -30429,6 +30495,7 @@ CFLAGS=$save_CFLAGS
 CPPFLAGS=$save_CPPFLAGS
 LDFLAGS=$save_LDFLAGS
 LIBS=$save_LIBS
+UNIQMODLIBS=$save_UNIQMODLIBS
 
 
 
@@ -30761,6 +30828,7 @@ save_CFLAGS=$CFLAGS
 save_CPPFLAGS=$CPPFLAGS
 save_LDFLAGS=$LDFLAGS
 save_LIBS=$LIBS
+save_UNIQMODLIBS=$UNIQMODLIBS
 
 
   LIBS="$LIBS $OPENSSL_LIBS"
@@ -30819,6 +30887,7 @@ CFLAGS=$save_CFLAGS
 CPPFLAGS=$save_CPPFLAGS
 LDFLAGS=$save_LDFLAGS
 LIBS=$save_LIBS
+UNIQMODLIBS=$save_UNIQMODLIBS
 
 
 
@@ -30826,6 +30895,7 @@ save_CFLAGS=$CFLAGS
 save_CPPFLAGS=$CPPFLAGS
 save_LDFLAGS=$LDFLAGS
 save_LIBS=$LIBS
+save_UNIQMODLIBS=$UNIQMODLIBS
 
 
   LIBS="$LIBS $LIBCRYPTO_LIBS"
@@ -30881,6 +30951,7 @@ CFLAGS=$save_CFLAGS
 CPPFLAGS=$save_CPPFLAGS
 LDFLAGS=$save_LDFLAGS
 LIBS=$save_LIBS
+UNIQMODLIBS=$save_UNIQMODLIBS
 
 
 
@@ -32531,8 +32602,10 @@ fi
 ###############################################################################
 # Cryptographic primitives
 LIBHASHLIB_INTERNAL_CFLAGS="-I\$(srcdir)/Modules/_hashlib"
-LIBHASHLIB_INTERNAL_LDFLAGS="-lm \$(LIBHASHLIB_INTERNAL_A)"
+LIBHASHLIB_INTERNAL_RULE_LDFLAGS="-lm \$(LIBHASHLIB_INTERNAL_A)"
 LIBHASHLIB_INTERNAL="\$(LIBHASHLIB_INTERNAL_HEADERS) \$(LIBHASHLIB_INTERNAL_A)"
+UNIQMODLIBS="$UNIQMODLIBS \$(LIBHASHLIB_INTERNAL_A)"
+
 
 
 
@@ -32760,6 +32833,9 @@ fi
 
 
   LIBHACL_MD5_LDFLAGS=LIBHACL_MD5_LIB_${LIBHACL_LDEPS_LIBTYPE}
+  # LDFLAGS will not contain the internal library helper as it could
+  # be duplicated. Instead, it will be linked added only for the rule
+  # and will be otherwise added to the interpreter directly.
 
   { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module _md5" >&5
 printf %s "checking for stdlib extension module _md5... " >&6; }
@@ -32786,7 +32862,7 @@ fi
 then :
 
     as_fn_append MODULE_BLOCK "MODULE__MD5_CFLAGS=$LIBHACL_CFLAGS $LIBHASHLIB_INTERNAL_CFLAGS$as_nl"
-    as_fn_append MODULE_BLOCK "MODULE__MD5_LDFLAGS=\$($LIBHACL_MD5_LDFLAGS) $LIBHASHLIB_INTERNAL_LDFLAGS$as_nl"
+    as_fn_append MODULE_BLOCK "MODULE__MD5_LDFLAGS=\$($LIBHACL_MD5_LDFLAGS)$as_nl"
 
 fi
    if test "$py_cv_module__md5" = yes; then
@@ -32805,6 +32881,9 @@ printf "%s\n" "$py_cv_module__md5" >&6; }
 
 
   LIBHACL_SHA1_LDFLAGS=LIBHACL_SHA1_LIB_${LIBHACL_LDEPS_LIBTYPE}
+  # LDFLAGS will not contain the internal library helper as it could
+  # be duplicated. Instead, it will be linked added only for the rule
+  # and will be otherwise added to the interpreter directly.
 
   { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module _sha1" >&5
 printf %s "checking for stdlib extension module _sha1... " >&6; }
@@ -32831,7 +32910,7 @@ fi
 then :
 
     as_fn_append MODULE_BLOCK "MODULE__SHA1_CFLAGS=$LIBHACL_CFLAGS $LIBHASHLIB_INTERNAL_CFLAGS$as_nl"
-    as_fn_append MODULE_BLOCK "MODULE__SHA1_LDFLAGS=\$($LIBHACL_SHA1_LDFLAGS) $LIBHASHLIB_INTERNAL_LDFLAGS$as_nl"
+    as_fn_append MODULE_BLOCK "MODULE__SHA1_LDFLAGS=\$($LIBHACL_SHA1_LDFLAGS)$as_nl"
 
 fi
    if test "$py_cv_module__sha1" = yes; then
@@ -32850,6 +32929,9 @@ printf "%s\n" "$py_cv_module__sha1" >&6; }
 
 
   LIBHACL_SHA2_LDFLAGS=LIBHACL_SHA2_LIB_${LIBHACL_LDEPS_LIBTYPE}
+  # LDFLAGS will not contain the internal library helper as it could
+  # be duplicated. Instead, it will be linked added only for the rule
+  # and will be otherwise added to the interpreter directly.
 
   { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module _sha2" >&5
 printf %s "checking for stdlib extension module _sha2... " >&6; }
@@ -32876,7 +32958,7 @@ fi
 then :
 
     as_fn_append MODULE_BLOCK "MODULE__SHA2_CFLAGS=$LIBHACL_CFLAGS $LIBHASHLIB_INTERNAL_CFLAGS$as_nl"
-    as_fn_append MODULE_BLOCK "MODULE__SHA2_LDFLAGS=\$($LIBHACL_SHA2_LDFLAGS) $LIBHASHLIB_INTERNAL_LDFLAGS$as_nl"
+    as_fn_append MODULE_BLOCK "MODULE__SHA2_LDFLAGS=\$($LIBHACL_SHA2_LDFLAGS)$as_nl"
 
 fi
    if test "$py_cv_module__sha2" = yes; then
@@ -32895,6 +32977,9 @@ printf "%s\n" "$py_cv_module__sha2" >&6; }
 
 
   LIBHACL_SHA3_LDFLAGS=LIBHACL_SHA3_LIB_${LIBHACL_LDEPS_LIBTYPE}
+  # LDFLAGS will not contain the internal library helper as it could
+  # be duplicated. Instead, it will be linked added only for the rule
+  # and will be otherwise added to the interpreter directly.
 
   { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module _sha3" >&5
 printf %s "checking for stdlib extension module _sha3... " >&6; }
@@ -32921,7 +33006,7 @@ fi
 then :
 
     as_fn_append MODULE_BLOCK "MODULE__SHA3_CFLAGS=$LIBHACL_CFLAGS $LIBHASHLIB_INTERNAL_CFLAGS$as_nl"
-    as_fn_append MODULE_BLOCK "MODULE__SHA3_LDFLAGS=\$($LIBHACL_SHA3_LDFLAGS) $LIBHASHLIB_INTERNAL_LDFLAGS$as_nl"
+    as_fn_append MODULE_BLOCK "MODULE__SHA3_LDFLAGS=\$($LIBHACL_SHA3_LDFLAGS)$as_nl"
 
 fi
    if test "$py_cv_module__sha3" = yes; then
@@ -32940,6 +33025,9 @@ printf "%s\n" "$py_cv_module__sha3" >&6; }
 
 
   LIBHACL_BLAKE2_LDFLAGS=LIBHACL_BLAKE2_LIB_${LIBHACL_LDEPS_LIBTYPE}
+  # LDFLAGS will not contain the internal library helper as it could
+  # be duplicated. Instead, it will be linked added only for the rule
+  # and will be otherwise added to the interpreter directly.
 
   { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module _blake2" >&5
 printf %s "checking for stdlib extension module _blake2... " >&6; }
@@ -32966,7 +33054,7 @@ fi
 then :
 
     as_fn_append MODULE_BLOCK "MODULE__BLAKE2_CFLAGS=$LIBHACL_CFLAGS $LIBHASHLIB_INTERNAL_CFLAGS$as_nl"
-    as_fn_append MODULE_BLOCK "MODULE__BLAKE2_LDFLAGS=\$($LIBHACL_BLAKE2_LDFLAGS) $LIBHASHLIB_INTERNAL_LDFLAGS$as_nl"
+    as_fn_append MODULE_BLOCK "MODULE__BLAKE2_LDFLAGS=\$($LIBHACL_BLAKE2_LDFLAGS)$as_nl"
 
 fi
    if test "$py_cv_module__blake2" = yes; then
@@ -32986,6 +33074,9 @@ printf "%s\n" "$py_cv_module__blake2" >&6; }
 
 
   LIBHACL_HMAC_LDFLAGS=LIBHACL_HMAC_LIB_${LIBHACL_LDEPS_LIBTYPE}
+  # LDFLAGS will not contain the internal library helper as it could
+  # be duplicated. Instead, it will be linked added only for the rule
+  # and will be otherwise added to the interpreter directly.
 
   { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module _hmac" >&5
 printf %s "checking for stdlib extension module _hmac... " >&6; }
@@ -33012,7 +33103,7 @@ fi
 then :
 
     as_fn_append MODULE_BLOCK "MODULE__HMAC_CFLAGS=$LIBHACL_CFLAGS $LIBHASHLIB_INTERNAL_CFLAGS$as_nl"
-    as_fn_append MODULE_BLOCK "MODULE__HMAC_LDFLAGS=\$($LIBHACL_HMAC_LDFLAGS) $LIBHASHLIB_INTERNAL_LDFLAGS$as_nl"
+    as_fn_append MODULE_BLOCK "MODULE__HMAC_LDFLAGS=\$($LIBHACL_HMAC_LDFLAGS)$as_nl"
 
 fi
    if test "$py_cv_module__hmac" = yes; then
@@ -33694,7 +33785,7 @@ fi
 then :
 
     as_fn_append MODULE_BLOCK "MODULE__HASHLIB_CFLAGS=$OPENSSL_INCLUDES $LIBHASHLIB_INTERNAL_CFLAGS$as_nl"
-    as_fn_append MODULE_BLOCK "MODULE__HASHLIB_LDFLAGS=$OPENSSL_LDFLAGS $OPENSSL_LDFLAGS_RPATH $LIBCRYPTO_LIBS $LIBHASHLIB_INTERNAL_LDFLAGS$as_nl"
+    as_fn_append MODULE_BLOCK "MODULE__HASHLIB_LDFLAGS=$OPENSSL_LDFLAGS $OPENSSL_LDFLAGS_RPATH $LIBCRYPTO_LIBS$as_nl"
 
 fi
    if test "$py_cv_module__hashlib" = yes; then
diff --git a/configure.ac b/configure.ac
index 1e590e1d0fd727..7f7d14bbb680aa 100644
--- a/configure.ac
+++ b/configure.ac
@@ -40,12 +40,14 @@ AC_DEFUN([SAVE_ENV],
 [_SAVE_VAR([CPPFLAGS])]
 [_SAVE_VAR([LDFLAGS])]
 [_SAVE_VAR([LIBS])]
+[_SAVE_VAR([UNIQMODLIBS])]
 )dnl
 AC_DEFUN([RESTORE_ENV],
 [_RESTORE_VAR([CFLAGS])]
 [_RESTORE_VAR([CPPFLAGS])]
 [_RESTORE_VAR([LDFLAGS])]
 [_RESTORE_VAR([LIBS])]
+[_RESTORE_VAR([UNIQMODLIBS])]
 )dnl
 AC_DEFUN([WITH_SAVE_ENV],
 [SAVE_ENV]
@@ -53,6 +55,9 @@ AC_DEFUN([WITH_SAVE_ENV],
 [RESTORE_ENV]
 )dnl
 
+UNIQMODLIBS=""
+AC_SUBST([UNIQMODLIBS])
+
 dnl PY_CHECK_FUNC(FUNCTION, [INCLUDES], [AC_DEFINE-VAR])
 AC_DEFUN([PY_CHECK_FUNC],
 [ AS_VAR_PUSHDEF([py_var], [ac_cv_func_$1])
@@ -7961,10 +7966,12 @@ PY_STDLIB_MOD_SIMPLE([unicodedata])
 ###############################################################################
 # Cryptographic primitives
 LIBHASHLIB_INTERNAL_CFLAGS="-I\$(srcdir)/Modules/_hashlib"
-LIBHASHLIB_INTERNAL_LDFLAGS="-lm \$(LIBHASHLIB_INTERNAL_A)"
+LIBHASHLIB_INTERNAL_RULE_LDFLAGS="-lm \$(LIBHASHLIB_INTERNAL_A)"
 LIBHASHLIB_INTERNAL="\$(LIBHASHLIB_INTERNAL_HEADERS) \$(LIBHASHLIB_INTERNAL_A)"
+UNIQMODLIBS="$UNIQMODLIBS \$(LIBHASHLIB_INTERNAL_A)"
 
 AC_SUBST([LIBHASHLIB_INTERNAL_CFLAGS])
+AC_SUBST([LIBHASHLIB_INTERNAL_RULE_LDFLAGS])
 AC_SUBST([LIBHASHLIB_INTERNAL])
 
 ###############################################################################
@@ -8103,9 +8110,12 @@ dnl The EXTNAME is the name of the extension module being built.
 AC_DEFUN([PY_HACL_CREATE_MODULE], [
   AS_VAR_PUSHDEF([v], [[LIBHACL_][$1][_LDFLAGS]])
   AS_VAR_SET([v], [[LIBHACL_][$1][_LIB_${LIBHACL_LDEPS_LIBTYPE}]])
+  # LDFLAGS will not contain the internal library helper as it could
+  # be duplicated. Instead, it will be linked added only for the rule
+  # and will be otherwise added to the interpreter directly.
   PY_STDLIB_MOD([$2], [$3], [],
     [$LIBHACL_CFLAGS $LIBHASHLIB_INTERNAL_CFLAGS],
-    [\$($v) $LIBHASHLIB_INTERNAL_LDFLAGS])
+    [\$($v)])
   AS_VAR_POPDEF([v])
 ])
 
@@ -8187,7 +8197,7 @@ PY_STDLIB_MOD([_ssl], [], [test "$ac_cv_working_openssl_ssl" = yes],
   [$OPENSSL_INCLUDES], [$OPENSSL_LDFLAGS $OPENSSL_LDFLAGS_RPATH $OPENSSL_LIBS])
 PY_STDLIB_MOD([_hashlib], [], [test "$ac_cv_working_openssl_hashlib" = yes],
   [$OPENSSL_INCLUDES $LIBHASHLIB_INTERNAL_CFLAGS],
-  [$OPENSSL_LDFLAGS $OPENSSL_LDFLAGS_RPATH $LIBCRYPTO_LIBS $LIBHASHLIB_INTERNAL_LDFLAGS])
+  [$OPENSSL_LDFLAGS $OPENSSL_LDFLAGS_RPATH $LIBCRYPTO_LIBS])
 
 dnl test modules
 PY_STDLIB_MOD([_testcapi],