diff options
| author | Matthias Krüger <476013+matthiaskrgr@users.noreply.github.com> | 2025-03-10 09:32:12 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-03-10 09:32:12 +0100 |
| commit | cbde8b9dcfb2017b1265da4a92cec640b0065d6d (patch) | |
| tree | 4f7cbe790ff4e56f1b4d4b78e3eb598cd02b09bb | |
| parent | 2270979935ff5f796b77cda898aa345581523389 (diff) | |
| parent | 7bf4e9977ebfd1de31b3daea3cec327f61ee1685 (diff) | |
| download | rust-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.rs | 25 |
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 }; +} |
