diff --git a/configure.ac b/configure.ac
index 31c3c259d7602ae890b6e3b29482cdb113211927..3a6dfd32da86de18edf9b7496294bfe6b14bb496 100644
--- a/configure.ac
+++ b/configure.ac
@@ -613,11 +613,17 @@ FPTOOLS_SET_C_LD_FLAGS([target],[CONF_CC_OPTS_STAGE1],[CONF_GCC_LINKER_OPTS_STAG
 FPTOOLS_SET_C_LD_FLAGS([target],[CONF_CC_OPTS_STAGE2],[CONF_GCC_LINKER_OPTS_STAGE2],[CONF_LD_LINKER_OPTS_STAGE2],[CONF_CPP_OPTS_STAGE2])
 # Stage 3 won't be supported by cross-compilation
 
+#-no_fixup_chains
 FP_LD_NO_FIXUP_CHAINS([target], [LDFLAGS])
 FP_LD_NO_FIXUP_CHAINS([build], [CONF_GCC_LINKER_OPTS_STAGE0])
 FP_LD_NO_FIXUP_CHAINS([target], [CONF_GCC_LINKER_OPTS_STAGE1])
 FP_LD_NO_FIXUP_CHAINS([target], [CONF_GCC_LINKER_OPTS_STAGE2])
 
+#-no_warn_duplicate_libraries
+FP_LD_NO_WARN_DUPLICATE_LIBRARIES([build], [CONF_GCC_LINKER_OPTS_STAGE0])
+FP_LD_NO_WARN_DUPLICATE_LIBRARIES([target], [CONF_GCC_LINKER_OPTS_STAGE1])
+FP_LD_NO_WARN_DUPLICATE_LIBRARIES([target], [CONF_GCC_LINKER_OPTS_STAGE2])
+
 FP_MERGE_OBJECTS_SUPPORTS_RESPONSE_FILES
 
 GHC_LLVM_TARGET_SET_VAR
diff --git a/distrib/configure.ac.in b/distrib/configure.ac.in
index d1493fff45915b94b6e0c3cb890e073e174c46d0..ecbfebef578476fc72ce38dac48bffd1fd4cd140 100644
--- a/distrib/configure.ac.in
+++ b/distrib/configure.ac.in
@@ -175,11 +175,17 @@ FPTOOLS_SET_C_LD_FLAGS([target],[CONF_CC_OPTS_STAGE1],[CONF_GCC_LINKER_OPTS_STAG
 # Stage 3 won't be supported by cross-compilation
 FPTOOLS_SET_C_LD_FLAGS([target],[CONF_CC_OPTS_STAGE2],[CONF_GCC_LINKER_OPTS_STAGE2],[CONF_LD_LINKER_OPTS_STAGE2],[CONF_CPP_OPTS_STAGE2])
 
+#-no_fixup_chains
 FP_LD_NO_FIXUP_CHAINS([target], [LDFLAGS])
 FP_LD_NO_FIXUP_CHAINS([build], [CONF_GCC_LINKER_OPTS_STAGE0])
 FP_LD_NO_FIXUP_CHAINS([target], [CONF_GCC_LINKER_OPTS_STAGE1])
 FP_LD_NO_FIXUP_CHAINS([target], [CONF_GCC_LINKER_OPTS_STAGE2])
 
+#-no_warn_duplicate_libraries
+FP_LD_NO_WARN_DUPLICATE_LIBRARIES([build], [CONF_GCC_LINKER_OPTS_STAGE0])
+FP_LD_NO_WARN_DUPLICATE_LIBRARIES([target], [CONF_GCC_LINKER_OPTS_STAGE1])
+FP_LD_NO_WARN_DUPLICATE_LIBRARIES([target], [CONF_GCC_LINKER_OPTS_STAGE2])
+
 FP_MERGE_OBJECTS_SUPPORTS_RESPONSE_FILES
 
 AC_SUBST(CONF_CC_OPTS_STAGE0)
diff --git a/m4/fp_ld_no_warn_duplicate_libraries.m4 b/m4/fp_ld_no_warn_duplicate_libraries.m4
new file mode 100644
index 0000000000000000000000000000000000000000..d0b8f2a91ce74c9b37eead7ed5666bed86fcec8f
--- /dev/null
+++ b/m4/fp_ld_no_warn_duplicate_libraries.m4
@@ -0,0 +1,29 @@
+# FP_LD_NO_WARN_DUPLICATE_LIBRARIES
+# ---------------------------------
+# XCode 15 introduced a new linker which warns on duplicate libraries being
+# linked. To disable this warning, we pass -Wl,-no_warn_duplicate_libraries as
+# suggested by Brad King in CMake issue #25297.
+#
+# This flag isn't necessarily available to other linkers on darwin, so we must
+# only configure it into the CC linker arguments if valid.
+#
+# $1 = the platform
+# $2 = the name of the linker flags variable when linking with $CC
+AC_DEFUN([FP_LD_NO_WARN_DUPLICATE_LIBRARIES], [
+    case $$1 in
+      *-darwin)
+      AC_MSG_CHECKING([whether the linker requires -no_warn_duplicate_libraries])
+      echo 'int main(void) {return 0;}' > conftest.c
+      if $CC -o conftest -Wl,-no_warn_duplicate_libraries conftest.c > /dev/null 2>&1
+      then
+          $2="$$2 -Wl,-no_warn_duplicate_libraries"
+          AC_MSG_RESULT([yes])
+      else
+          AC_MSG_RESULT([no])
+      fi
+      rm -f conftest.c conftest.o conftest
+      ;;
+
+    esac
+])
+
diff --git a/utils/ghc-toolchain/src/GHC/Toolchain/Tools/Link.hs b/utils/ghc-toolchain/src/GHC/Toolchain/Tools/Link.hs
index 61b7a1c822be2efba4190cdf461d2cd60fdb0037..080427c7d634acbc069b2cb4a62fa89b313406d7 100644
--- a/utils/ghc-toolchain/src/GHC/Toolchain/Tools/Link.hs
+++ b/utils/ghc-toolchain/src/GHC/Toolchain/Tools/Link.hs
@@ -73,6 +73,7 @@ findCcLink target ld progOpt ldOverride archOs cc readelf = checking "for C comp
                        ccLinkSupportsCompactUnwind, ccLinkSupportsFilelist,
                        ccLinkIsGnu}
   ccLink <- linkRequiresNoFixupChains archOs cc ccLink
+  ccLink <- linkRequiresNoWarnDuplicateLibraries archOs cc ccLink
   return ccLink
 
 
@@ -320,7 +321,7 @@ addNoAsNeeded archOs cc ccLink
       return ccLink'
   | otherwise = return ccLink
 
--- See if whether we are using a version of ld64 on darwin platforms which
+-- | See if whether we are using a version of ld64 on darwin platforms which
 -- requires us to pass -no_fixup_chains
 linkRequiresNoFixupChains :: ArchOS -> Cc -> CcLink -> M CcLink
 linkRequiresNoFixupChains archOs cc ccLink
@@ -329,4 +330,16 @@ linkRequiresNoFixupChains archOs cc ccLink
        in (ccLink' <$ checkLinkWorks cc (ccLinkProgram ccLink')) <|> return ccLink
   | otherwise = return ccLink
 
+-- | XCode 15 introduced a new linker which warns on duplicate libraries being
+-- linked. To disable this warning, we pass -Wl,-no_warn_duplicate_libraries as
+-- suggested by Brad King in CMake issue #25297.
+--
+-- This flag isn't necessarily available to other linkers on darwin, so we must
+-- only configure it into the CC linker arguments if valid.
+linkRequiresNoWarnDuplicateLibraries :: ArchOS -> Cc -> CcLink -> M CcLink
+linkRequiresNoWarnDuplicateLibraries archOs cc ccLink
+  | OSDarwin <- archOS_OS archOs = checking "whether CC linker requires -no_warn_duplicate_libraries" $
+      let ccLink' = over (_ccLinkProgram % _prgFlags) (++["-Wl,-no_warn_duplicate_libraries"]) ccLink
+       in (ccLink' <$ checkLinkWorks cc (ccLinkProgram ccLink')) <|> return ccLink
+  | otherwise = return ccLink