about summary refs log tree commit diff
path: root/tests/ui/linking
diff options
context:
space:
mode:
authorJakub Beránek <berykubik@gmail.com>2025-03-03 10:34:26 +0100
committerJakub Beránek <berykubik@gmail.com>2025-03-08 19:03:49 +0100
commit7bf4e9977ebfd1de31b3daea3cec327f61ee1685 (patch)
tree989df5f467b1e33f0b8cd510e10c51fb7f2b3dc6 /tests/ui/linking
parent79b43dfde9dd1e3bed3c6ef7e9cfc708422f671f (diff)
downloadrust-7bf4e9977ebfd1de31b3daea3cec327f61ee1685.tar.gz
rust-7bf4e9977ebfd1de31b3daea3cec327f61ee1685.zip
Add test for garbage collection of encapsulation symbols
Diffstat (limited to 'tests/ui/linking')
-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 };
+}