--- a/src/bootstrap/src/core/config/config.rs +++ b/src/bootstrap/src/core/config/config.rs @@ -628,7 +628,7 @@ ); } - let bootstrap_override_lld = + let mut bootstrap_override_lld = rust_bootstrap_override_lld.or(rust_bootstrap_override_lld_legacy).unwrap_or_default(); if rust_optimize.as_ref().is_some_and(|v| matches!(v, RustOptimize::Bool(false))) { @@ -978,6 +978,20 @@ let is_host_system_llvm = is_system_llvm(&target_config, llvm_from_ci, host_target, host_target); + // Self-contained bootstrap LLD comes from the stage0 sysroot (`rust-lld`), whose LLVM + // version may differ from an externally configured host LLVM. In that case, linking LLVM + // bitcode objects can fail with "Unknown attribute kind". + if is_host_system_llvm + && matches!(bootstrap_override_lld, BootstrapOverrideLld::SelfContained) + { + eprintln!( + "WARNING: `rust.bootstrap-override-lld = \"self-contained\"` with external host \ + `llvm-config` can cause LLVM bitcode version mismatches; falling back to \ + `rust.bootstrap-override-lld = \"external\"` for bootstrap linking." + ); + bootstrap_override_lld = BootstrapOverrideLld::External; + } + if llvm_from_ci { let warn = |option: &str| { println!( @@ -1042,21 +1056,27 @@ let default_linux_linker_override = match linker_override { DefaultLinuxLinkerOverride::Off => continue, DefaultLinuxLinkerOverride::SelfContainedLldCc => { - // If we automatically default to the self-contained LLD linker, - // we also need to handle the rust.lld option. - match rust_lld_enabled { - // If LLD was not enabled explicitly, we enable it, unless LLVM config has - // been set - None if !is_host_system_llvm => { - lld_enabled = true; - Some(DefaultLinuxLinkerOverride::SelfContainedLldCc) + // If bootstrap is explicitly using an external `lld` binary, do not also + // embed a self-contained rust-lld default into rustc's Linux target spec. + if matches!(bootstrap_override_lld, BootstrapOverrideLld::External) { + None + } else { + // If we automatically default to the self-contained LLD linker, + // we also need to handle the rust.lld option. + match rust_lld_enabled { + // If LLD was not enabled explicitly, we enable it, unless LLVM config has + // been set + None if !is_host_system_llvm => { + lld_enabled = true; + Some(DefaultLinuxLinkerOverride::SelfContainedLldCc) + } + None => None, + // If it was enabled already, we don't need to do anything + Some(true) => Some(DefaultLinuxLinkerOverride::SelfContainedLldCc), + // If it was explicitly disabled, we do not apply the + // linker override + Some(false) => None, } - None => None, - // If it was enabled already, we don't need to do anything - Some(true) => Some(DefaultLinuxLinkerOverride::SelfContainedLldCc), - // If it was explicitly disabled, we do not apply the - // linker override - Some(false) => None, } } };