about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMatthias Krüger <476013+matthiaskrgr@users.noreply.github.com>2025-03-10 09:32:12 +0100
committerGitHub <noreply@github.com>2025-03-10 09:32:12 +0100
commitcbde8b9dcfb2017b1265da4a92cec640b0065d6d (patch)
tree4f7cbe790ff4e56f1b4d4b78e3eb598cd02b09bb
parent2270979935ff5f796b77cda898aa345581523389 (diff)
parent7bf4e9977ebfd1de31b3daea3cec327f61ee1685 (diff)
downloadrust-cbde8b9dcfb2017b1265da4a92cec640b0065d6d.tar.gz
rust-cbde8b9dcfb2017b1265da4a92cec640b0065d6d.zip
Rollup merge of #137926 - Kobzol:lld-no-start-stop-test, r=lqd
Add a test for `-znostart-stop-gc` usage with LLD

This test replicates the behavior of https://github.com/dtolnay/linkme, to test that it still works even with LLD. Without `-znostart-stop-gc` the test fails.

r? ``@lqd``

try-job: x86_64-gnu
try-job: x86_64-msvc-1
-rw-r--r--tests/ui/linking/no-gc-encapsulation-symbols.rs25
1 files changed, 25 insertions, 0 deletions
diff --git a/tests/ui/linking/no-gc-encapsulation-symbols.rs b/tests/ui/linking/no-gc-encapsulation-symbols.rs
new file mode 100644
index 00000000000..36d69969199
--- /dev/null
+++ b/tests/ui/linking/no-gc-encapsulation-symbols.rs
@@ -0,0 +1,25 @@
+// This test checks that encapsulation symbols are not garbage collected by the linker.
+// LLD will remove them by default, so this test checks that we pass `-znostart-stop-gc` to LLD
+// to avoid that behavior. Without that flag, the test should fail.
+// This test is inspired by the behavior of the linkme crate.
+//
+//@ build-pass
+//@ only-x86_64-unknown-linux-gnu
+
+unsafe extern "Rust" {
+    // The __start_ section name is magical for the linker,
+    // It will put link sections named EXTERNFNS after it.
+    #[link_name = "__start_EXTERNFNS"]
+    static SECTION_START: fn();
+}
+
+#[used]
+#[unsafe(link_section = "EXTERNFNS")]
+static EXTERN_FN_LOCAL: fn() = extern_fn;
+
+fn extern_fn() {}
+
+fn main() {
+    // We need to reference the SECTION_START symbol to avoid it being garbage collected
+    let slice = unsafe { SECTION_START };
+}