diff --git a/src/tools/tidy/src/allowed_run_make_makefiles.txt b/src/tools/tidy/src/allowed_run_make_makefiles.txt
index 9b3c0d0f1a570..1b560ee352c6c 100644
--- a/src/tools/tidy/src/allowed_run_make_makefiles.txt
+++ b/src/tools/tidy/src/allowed_run_make_makefiles.txt
@@ -220,7 +220,6 @@ run-make/pretty-print-to-file/Makefile
 run-make/pretty-print-with-dep-file/Makefile
 run-make/print-calling-conventions/Makefile
 run-make/print-cfg/Makefile
-run-make/print-native-static-libs/Makefile
 run-make/print-target-list/Makefile
 run-make/profile/Makefile
 run-make/prune-link-args/Makefile
diff --git a/tests/run-make/print-native-static-libs/Makefile b/tests/run-make/print-native-static-libs/Makefile
deleted file mode 100644
index a16c8b0f2a405..0000000000000
--- a/tests/run-make/print-native-static-libs/Makefile
+++ /dev/null
@@ -1,19 +0,0 @@
-include ../tools.mk
-
-# ignore-cross-compile
-# ignore-wasm
-
-all:
-	$(RUSTC) --crate-type rlib -lbar_cli bar.rs
-	$(RUSTC) foo.rs -lfoo_cli -lfoo_cli --crate-type staticlib --print native-static-libs 2>&1 \
-		| grep 'note: native-static-libs: ' \
-		| sed 's/note: native-static-libs: \(.*\)/\1/' > $(TMPDIR)/libs.txt
-
-	cat $(TMPDIR)/libs.txt | grep -F "glib-2.0" # in bar.rs
-	cat $(TMPDIR)/libs.txt | grep -F "systemd" # in foo.rs
-	cat $(TMPDIR)/libs.txt | grep -F "bar_cli"
-	cat $(TMPDIR)/libs.txt | grep -F "foo_cli"
-
-    # make sure that foo_cli and glib-2.0 are not consecutively present
-	cat $(TMPDIR)/libs.txt | grep -Fv "foo_cli -lfoo_cli"
-	cat $(TMPDIR)/libs.txt | grep -Fv "glib-2.0 -lglib-2.0"
diff --git a/tests/run-make/print-native-static-libs/rmake.rs b/tests/run-make/print-native-static-libs/rmake.rs
new file mode 100644
index 0000000000000..fc8701777d123
--- /dev/null
+++ b/tests/run-make/print-native-static-libs/rmake.rs
@@ -0,0 +1,76 @@
+//! This checks the output of `--print=native-static-libs`
+//!
+//! Specifically, this test makes sure that one and only one
+//! note is emitted with the text "native-static-libs:" as prefix
+//! that the note contains the link args given in the source code
+//! and cli of the current crate and downstream crates.
+//!
+//! It also checks that there aren't any duplicated consecutive
+//! args, as they are useless and suboptimal for debugability.
+//! See https://github.com/rust-lang/rust/issues/113209.
+
+//@ ignore-cross-compile
+//@ ignore-wasm
+
+extern crate run_make_support;
+
+use std::io::BufRead;
+
+use run_make_support::{rustc, is_msvc};
+
+fn main() {
+    // build supporting crate
+    rustc()
+        .input("bar.rs")
+        .crate_type("rlib")
+        .arg("-lbar_cli")
+        .run();
+
+    // build main crate as staticlib
+    let output = rustc()
+        .input("foo.rs")
+        .crate_type("staticlib")
+        .arg("-lfoo_cli")
+        .arg("-lfoo_cli") // 2nd time
+        .print("native-static-libs")
+        .run();
+
+    let mut found_note = false;
+    for l in output.stderr.lines() {
+        let l = l.expect("utf-8 string");
+
+        let Some(args) = l.strip_prefix("note: native-static-libs:") else { continue; };
+        assert!(!found_note);
+        found_note = true;
+
+        let args: Vec<&str> = args.trim().split_ascii_whitespace().collect();
+
+        macro_rules! assert_contains_lib {
+            ($lib:literal in $args:ident) => {{
+                let lib = format!(
+                    "{}{}{}",
+                    if !is_msvc() { "-l" } else { "" },
+                    $lib,
+                    if !is_msvc() { "" } else { ".lib" },
+                );
+                let found = $args.contains(&&*lib);
+                assert!(found, "unable to find lib `{}` in those linker args: {:?}", lib, $args);
+            }}
+        }
+
+        assert_contains_lib!("glib-2.0" in args); // in bar.rs
+        assert_contains_lib!("systemd" in args);  // in foo.rs
+        assert_contains_lib!("bar_cli" in args);
+        assert_contains_lib!("foo_cli" in args);
+
+        // make sure that no args are consecutively present
+        let dedup_args: Vec<&str> = {
+            let mut args = args.clone();
+            args.dedup();
+            args
+        };
+        assert_eq!(args, dedup_args);
+    }
+
+    assert!(found_note);
+}