diff options
| author | Jakub Beránek <berykubik@gmail.com> | 2025-03-03 10:34:26 +0100 |
|---|---|---|
| committer | Jakub Beránek <berykubik@gmail.com> | 2025-03-08 19:03:49 +0100 |
| commit | 7bf4e9977ebfd1de31b3daea3cec327f61ee1685 (patch) | |
| tree | 989df5f467b1e33f0b8cd510e10c51fb7f2b3dc6 /tests/ui/linking | |
| parent | 79b43dfde9dd1e3bed3c6ef7e9cfc708422f671f (diff) | |
| download | rust-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.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 }; +} |
