mirror of
https://github.com/rust-lang/rust.git
synced 2025-05-09 16:37:36 +00:00
set subsections_via_symbols for ld64 helper sections
This commit is contained in:
parent
65fa0ab924
commit
b1a38313cb
@ -2015,6 +2015,12 @@ fn add_linked_symbol_object(
|
|||||||
file.set_mangling(object::write::Mangling::None);
|
file.set_mangling(object::write::Mangling::None);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if file.format() == object::BinaryFormat::MachO {
|
||||||
|
// Divide up the sections into sub-sections via symbols for dead code stripping.
|
||||||
|
// Without this flag, unused `#[no_mangle]` or `#[used]` cannot be discard on MachO targets.
|
||||||
|
file.set_subsections_via_symbols();
|
||||||
|
}
|
||||||
|
|
||||||
// ld64 requires a relocation to load undefined symbols, see below.
|
// ld64 requires a relocation to load undefined symbols, see below.
|
||||||
// Not strictly needed if linking with lld, but might as well do it there too.
|
// Not strictly needed if linking with lld, but might as well do it there too.
|
||||||
let ld64_section_helper = if file.format() == object::BinaryFormat::MachO {
|
let ld64_section_helper = if file.format() == object::BinaryFormat::MachO {
|
||||||
|
20
tests/ui/linking/cdylib-no-mangle.rs
Normal file
20
tests/ui/linking/cdylib-no-mangle.rs
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
//@ only-apple
|
||||||
|
//@ build-fail
|
||||||
|
//@ dont-check-compiler-stderr
|
||||||
|
//@ dont-check-compiler-stdout
|
||||||
|
|
||||||
|
// Regression test for <https://github.com/rust-lang/rust/issues/139744>.
|
||||||
|
// Functions in the dynamic library marked with no_mangle should not be GC-ed.
|
||||||
|
|
||||||
|
#![crate_type = "cdylib"]
|
||||||
|
|
||||||
|
unsafe extern "C" {
|
||||||
|
unsafe static THIS_SYMBOL_SHOULD_BE_UNDEFINED: usize;
|
||||||
|
}
|
||||||
|
|
||||||
|
#[unsafe(no_mangle)]
|
||||||
|
pub unsafe fn function_marked_with_no_mangle() {
|
||||||
|
println!("FUNCTION_MARKED_WITH_NO_MANGLE = {}", unsafe { THIS_SYMBOL_SHOULD_BE_UNDEFINED });
|
||||||
|
}
|
||||||
|
|
||||||
|
//~? ERROR linking
|
27
tests/ui/linking/executable-no-mangle-strip.rs
Normal file
27
tests/ui/linking/executable-no-mangle-strip.rs
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
//@ run-pass
|
||||||
|
//@ ignore-windows-gnu: only statics marked with used can be GC-ed on windows-gnu
|
||||||
|
|
||||||
|
// Regression test for <https://github.com/rust-lang/rust/issues/139744>.
|
||||||
|
// Functions in the binary marked with no_mangle should be GC-ed if they
|
||||||
|
// are not indirectly referenced by main.
|
||||||
|
|
||||||
|
#![feature(used_with_arg)]
|
||||||
|
|
||||||
|
#[cfg_attr(windows, link(name = "this_lib_does_not_exist", kind = "raw-dylib"))]
|
||||||
|
unsafe extern "C" {
|
||||||
|
unsafe static THIS_SYMBOL_SHOULD_BE_UNDEFINED: usize;
|
||||||
|
}
|
||||||
|
|
||||||
|
#[unsafe(no_mangle)]
|
||||||
|
pub unsafe fn function_marked_with_no_mangle() {
|
||||||
|
println!("FUNCTION_MARKED_WITH_NO_MANGLE = {}", unsafe { THIS_SYMBOL_SHOULD_BE_UNDEFINED });
|
||||||
|
}
|
||||||
|
|
||||||
|
#[used(compiler)]
|
||||||
|
pub static FUNCTION_MARKED_WITH_USED: unsafe fn() = || {
|
||||||
|
println!("FUNCTION_MARKED_WITH_USED = {}", unsafe { THIS_SYMBOL_SHOULD_BE_UNDEFINED });
|
||||||
|
};
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
println!("MAIN");
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user