Auto merge of #140872 - bjorn3:elf_use_used_linker, r=nikic
Make #[used(linker)] the default on ELF too `#[used]` currently is an alias for `#[used(linker)]` on all platforms except ELF based ones where it is an alias for `#[used(compiler)]`. The latter has surprising behavior and the LLVM LangRef explicitly states that it "should only be used in rare circumstances, and should not be exposed to source languages." [^2] The reason `#[used]` still was an alias to `#[used(compiler)]` on ELF is because the gold linker has issues with it. Luckily gold has been deprecated with GCC 15 [^1] and seems to be unable to bootstrap rustc anyway [^3]. As such we shouldn't really care about supporting gold. This would also allow re-enabling start-stop-gc with lld. cc https://github.com/rust-lang/rust/issues/93798 Likely fixes https://github.com/rust-lang/rust/issues/85045 [^1]: https://lists.gnu.org/archive/html/info-gnu/2025-02/msg00001.html [^2]: https://llvm.org/docs/LangRef.html#the-llvm-compiler-used-global-variable [^3]: https://github.com/rust-lang/rust/issues/139425
This commit is contained in:
@@ -1961,7 +1961,7 @@ fn add_post_link_args(cmd: &mut dyn Linker, sess: &Session, flavor: LinkerFlavor
|
||||
/// This method creates a synthetic object file, which contains undefined references to all symbols
|
||||
/// that are necessary for the linking. They are only present in symbol table but not actually
|
||||
/// used in any sections, so the linker will therefore pick relevant rlibs for linking, but
|
||||
/// unused `#[no_mangle]` or `#[used]` can still be discard by GC sections.
|
||||
/// unused `#[no_mangle]` or `#[used(compiler)]` can still be discard by GC sections.
|
||||
///
|
||||
/// There's a few internal crates in the standard library (aka libcore and
|
||||
/// libstd) which actually have a circular dependence upon one another. This
|
||||
@@ -1995,7 +1995,8 @@ fn add_linked_symbol_object(
|
||||
|
||||
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.
|
||||
// Without this flag, unused `#[no_mangle]` or `#[used(compiler)]` cannot be
|
||||
// discard on MachO targets.
|
||||
file.set_subsections_via_symbols();
|
||||
}
|
||||
|
||||
|
||||
@@ -195,35 +195,10 @@ fn codegen_fn_attrs(tcx: TyCtxt<'_>, did: LocalDefId) -> CodegenFnAttrs {
|
||||
tcx.dcx().emit_err(errors::ExpectedUsedSymbol { span: attr.span() });
|
||||
}
|
||||
None => {
|
||||
// Unfortunately, unconditionally using `llvm.used` causes
|
||||
// issues in handling `.init_array` with the gold linker,
|
||||
// but using `llvm.compiler.used` caused a nontrivial amount
|
||||
// of unintentional ecosystem breakage -- particularly on
|
||||
// Mach-O targets.
|
||||
//
|
||||
// As a result, we emit `llvm.compiler.used` only on ELF
|
||||
// targets. This is somewhat ad-hoc, but actually follows
|
||||
// our pre-LLVM 13 behavior (prior to the ecosystem
|
||||
// breakage), and seems to match `clang`'s behavior as well
|
||||
// (both before and after LLVM 13), possibly because they
|
||||
// have similar compatibility concerns to us. See
|
||||
// https://github.com/rust-lang/rust/issues/47384#issuecomment-1019080146
|
||||
// and following comments for some discussion of this, as
|
||||
// well as the comments in `rustc_codegen_llvm` where these
|
||||
// flags are handled.
|
||||
//
|
||||
// Anyway, to be clear: this is still up in the air
|
||||
// somewhat, and is subject to change in the future (which
|
||||
// is a good thing, because this would ideally be a bit
|
||||
// more firmed up).
|
||||
let is_like_elf = !(tcx.sess.target.is_like_darwin
|
||||
|| tcx.sess.target.is_like_windows
|
||||
|| tcx.sess.target.is_like_wasm);
|
||||
codegen_fn_attrs.flags |= if is_like_elf {
|
||||
CodegenFnAttrFlags::USED_COMPILER
|
||||
} else {
|
||||
CodegenFnAttrFlags::USED_LINKER
|
||||
};
|
||||
// Unconditionally using `llvm.used` causes issues in handling
|
||||
// `.init_array` with the gold linker. Luckily gold has been
|
||||
// deprecated with GCC 15 and rustc now warns about using gold.
|
||||
codegen_fn_attrs.flags |= CodegenFnAttrFlags::USED_LINKER
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user