Rollup merge of #131405 - davidtwco:hardcoded-strip-macos, r=jieyouxu,albertlarsan68

bootstrap/codegen_ssa: ship llvm-strip and use it for -Cstrip

Fixes #131206.

- Includes `llvm-strip` (a symlink to `llvm-objcopy`) in the compiler dist artifact so that it can be used for `-Cstrip` instead of the system tooling.
- Uses `llvm-strip` instead of `/usr/bin/strip` for macOS. macOS needs a specific linker and the system one is preferred, hence #130781 but that doesn't work when cross-compiling, so use the `llvm-strip` utility instead.

cc #123151
This commit is contained in:
Matthias Krüger 2024-11-05 23:43:56 +01:00 committed by GitHub
commit 8dee3e978a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 47 additions and 11 deletions

View File

@ -2,6 +2,8 @@ codegen_ssa_L4Bender_exporting_symbols_unimplemented = exporting symbols not imp
codegen_ssa_add_native_library = failed to add native library {$library_path}: {$error} codegen_ssa_add_native_library = failed to add native library {$library_path}: {$error}
codegen_ssa_aix_strip_not_used = using host's `strip` binary to cross-compile to AIX which is not guaranteed to work
codegen_ssa_apple_deployment_target_invalid = codegen_ssa_apple_deployment_target_invalid =
failed to parse deployment target specified in {$env_var}: {$error} failed to parse deployment target specified in {$env_var}: {$error}

View File

@ -1085,9 +1085,7 @@ fn is_illegal_instruction(_status: &ExitStatus) -> bool {
let strip = sess.opts.cg.strip; let strip = sess.opts.cg.strip;
if sess.target.is_like_osx { if sess.target.is_like_osx {
// Use system `strip` when running on host macOS. let stripcmd = "rust-objcopy";
// <https://github.com/rust-lang/rust/pull/130781>
let stripcmd = if cfg!(target_os = "macos") { "/usr/bin/strip" } else { "strip" };
match (strip, crate_type) { match (strip, crate_type) {
(Strip::Debuginfo, _) => { (Strip::Debuginfo, _) => {
strip_symbols_with_external_utility(sess, stripcmd, out_filename, Some("-S")) strip_symbols_with_external_utility(sess, stripcmd, out_filename, Some("-S"))
@ -1103,11 +1101,14 @@ fn is_illegal_instruction(_status: &ExitStatus) -> bool {
} }
} }
if sess.target.os == "illumos" { if sess.target.is_like_solaris {
// Many illumos systems will have both the native 'strip' utility and // Many illumos systems will have both the native 'strip' utility and
// the GNU one. Use the native version explicitly and do not rely on // the GNU one. Use the native version explicitly and do not rely on
// what's in the path. // what's in the path.
let stripcmd = "/usr/bin/strip"; //
// If cross-compiling and there is not a native version, then use
// `llvm-strip` and hope.
let stripcmd = if !sess.host.is_like_solaris { "rust-objcopy" } else { "/usr/bin/strip" };
match strip { match strip {
// Always preserve the symbol table (-x). // Always preserve the symbol table (-x).
Strip::Debuginfo => { Strip::Debuginfo => {
@ -1120,6 +1121,10 @@ fn is_illegal_instruction(_status: &ExitStatus) -> bool {
} }
if sess.target.is_like_aix { if sess.target.is_like_aix {
// `llvm-strip` doesn't work for AIX - their strip must be used.
if !sess.host.is_like_aix {
sess.dcx().emit_warn(errors::AixStripNotUsed);
}
let stripcmd = "/usr/bin/strip"; let stripcmd = "/usr/bin/strip";
match strip { match strip {
Strip::Debuginfo => { Strip::Debuginfo => {
@ -1147,6 +1152,13 @@ fn strip_symbols_with_external_utility(
if let Some(option) = option { if let Some(option) = option {
cmd.arg(option); cmd.arg(option);
} }
let mut new_path = sess.get_tools_search_paths(false);
if let Some(path) = env::var_os("PATH") {
new_path.extend(env::split_paths(&path));
}
cmd.env("PATH", env::join_paths(new_path).unwrap());
let prog = cmd.arg(out_filename).output(); let prog = cmd.arg(out_filename).output();
match prog { match prog {
Ok(prog) => { Ok(prog) => {

View File

@ -1110,3 +1110,7 @@ fn into_diag(self, dcx: DiagCtxtHandle<'_>, level: Level) -> Diag<'_, G> {
diag diag
} }
} }
#[derive(Diagnostic)]
#[diag(codegen_ssa_aix_strip_not_used)]
pub(crate) struct AixStripNotUsed;

View File

@ -219,8 +219,7 @@ fn run(self, builder: &Builder<'_>) {
.join(compiler.host) .join(compiler.host)
.join("bin"); .join("bin");
if src_sysroot_bin.exists() { if src_sysroot_bin.exists() {
let target_sysroot_bin = let target_sysroot_bin = builder.sysroot_target_bindir(compiler, target);
builder.sysroot_target_libdir(compiler, target).parent().unwrap().join("bin");
t!(fs::create_dir_all(&target_sysroot_bin)); t!(fs::create_dir_all(&target_sysroot_bin));
builder.cp_link_r(&src_sysroot_bin, &target_sysroot_bin); builder.cp_link_r(&src_sysroot_bin, &target_sysroot_bin);
} }
@ -1977,6 +1976,14 @@ fn run(self, builder: &Builder<'_>) -> Compiler {
} }
} }
{
// `llvm-strip` is used by rustc, which is actually just a symlink to `llvm-objcopy`,
// so copy and rename `llvm-objcopy`.
let src_exe = exe("llvm-objcopy", target_compiler.host);
let dst_exe = exe("rust-objcopy", target_compiler.host);
builder.copy_link(&libdir_bin.join(src_exe), &libdir_bin.join(dst_exe));
}
// In addition to `rust-lld` also install `wasm-component-ld` when // In addition to `rust-lld` also install `wasm-component-ld` when
// LLD is enabled. This is a relatively small binary that primarily // LLD is enabled. This is a relatively small binary that primarily
// delegates to the `rust-lld` binary for linking and then runs // delegates to the `rust-lld` binary for linking and then runs

View File

@ -459,8 +459,7 @@ fn prepare_image(builder: &Builder<'_>, compiler: Compiler, image: &Path) {
// Copy over lld if it's there // Copy over lld if it's there
if builder.config.lld_enabled { if builder.config.lld_enabled {
let src_dir = let src_dir = builder.sysroot_target_bindir(compiler, host);
builder.sysroot_target_libdir(compiler, host).parent().unwrap().join("bin");
let rust_lld = exe("rust-lld", compiler.host); let rust_lld = exe("rust-lld", compiler.host);
builder.copy_link(&src_dir.join(&rust_lld), &dst_dir.join(&rust_lld)); builder.copy_link(&src_dir.join(&rust_lld), &dst_dir.join(&rust_lld));
let self_contained_lld_src_dir = src_dir.join("gcc-ld"); let self_contained_lld_src_dir = src_dir.join("gcc-ld");
@ -474,9 +473,16 @@ fn prepare_image(builder: &Builder<'_>, compiler: Compiler, image: &Path) {
); );
} }
} }
{
let src_dir = builder.sysroot_target_bindir(compiler, host);
let llvm_objcopy = exe("llvm-objcopy", compiler.host);
let rust_objcopy = exe("rust-objcopy", compiler.host);
builder.copy_link(&src_dir.join(&llvm_objcopy), &dst_dir.join(&rust_objcopy));
}
if builder.tool_enabled("wasm-component-ld") { if builder.tool_enabled("wasm-component-ld") {
let src_dir = let src_dir = builder.sysroot_target_bindir(compiler, host);
builder.sysroot_target_libdir(compiler, host).parent().unwrap().join("bin");
let ld = exe("wasm-component-ld", compiler.host); let ld = exe("wasm-component-ld", compiler.host);
builder.copy_link(&src_dir.join(&ld), &dst_dir.join(&ld)); builder.copy_link(&src_dir.join(&ld), &dst_dir.join(&ld));
} }

View File

@ -1161,6 +1161,11 @@ pub fn sysroot(&self, compiler: Compiler) -> PathBuf {
self.ensure(compile::Sysroot::new(compiler)) self.ensure(compile::Sysroot::new(compiler))
} }
/// Returns the bindir for a compiler's sysroot.
pub fn sysroot_target_bindir(&self, compiler: Compiler, target: TargetSelection) -> PathBuf {
self.sysroot_target_libdir(compiler, target).parent().unwrap().join("bin")
}
/// Returns the libdir where the standard library and other artifacts are /// Returns the libdir where the standard library and other artifacts are
/// found for a compiler's sysroot. /// found for a compiler's sysroot.
pub fn sysroot_target_libdir(&self, compiler: Compiler, target: TargetSelection) -> PathBuf { pub fn sysroot_target_libdir(&self, compiler: Compiler, target: TargetSelection) -> PathBuf {