diff --git a/compiler/rustc_codegen_ssa/src/back/link.rs b/compiler/rustc_codegen_ssa/src/back/link.rs index 5149e3a12f2..6a2a394c63a 100644 --- a/compiler/rustc_codegen_ssa/src/back/link.rs +++ b/compiler/rustc_codegen_ssa/src/back/link.rs @@ -1117,14 +1117,14 @@ fn link_natively( let stripcmd = "rust-objcopy"; match (strip, crate_type) { (Strip::Debuginfo, _) => { - strip_symbols_with_external_utility(sess, stripcmd, out_filename, Some("-S")) + strip_symbols_with_external_utility(sess, stripcmd, out_filename, Some("--strip-debug")) } // Per the manpage, `-x` is the maximum safe strip level for dynamic libraries. (#93988) (Strip::Symbols, CrateType::Dylib | CrateType::Cdylib | CrateType::ProcMacro) => { strip_symbols_with_external_utility(sess, stripcmd, out_filename, Some("-x")) } (Strip::Symbols, _) => { - strip_symbols_with_external_utility(sess, stripcmd, out_filename, None) + strip_symbols_with_external_utility(sess, stripcmd, out_filename, Some("--strip-all")) } (Strip::None, _) => {} } diff --git a/tests/run-make/strip/hello.rs b/tests/run-make/strip/hello.rs new file mode 100644 index 00000000000..2dc0376650b --- /dev/null +++ b/tests/run-make/strip/hello.rs @@ -0,0 +1,8 @@ +fn main() { + hey_i_get_compiled(); +} + +#[inline(never)] +fn hey_i_get_compiled() { + println!("Hi! Do or do not strip me, your choice."); +} diff --git a/tests/run-make/strip/rmake.rs b/tests/run-make/strip/rmake.rs new file mode 100644 index 00000000000..ef1acc26b45 --- /dev/null +++ b/tests/run-make/strip/rmake.rs @@ -0,0 +1,42 @@ +//@ ignore-windows Windows does not actually strip + +// Test that -Cstrip correctly strips/preserves debuginfo and symbols. + +use run_make_support::{bin_name, is_darwin, llvm_dwarfdump, llvm_nm, rustc}; + +fn main() { + // We use DW_ (the start of any DWARF name) to check that some debuginfo is present. + let dwarf_indicator = "DW_"; + + let test_symbol = "hey_i_get_compiled"; + let binary = &bin_name("hello"); + + // Avoid checking debuginfo on darwin, because it is not actually affected by strip. + // Darwin *never* puts debuginfo in the main binary (-Csplit-debuginfo=off just removes it), + // so we never actually have any debuginfo in there, so we can't check that it's present. + let do_debuginfo_check = !is_darwin(); + + // Additionally, use -Cdebuginfo=2 to make the test independent of the amount of debuginfo + // for std. + + // -Cstrip=none should preserve symbols and debuginfo. + rustc().arg("hello.rs").arg("-Cdebuginfo=2").arg("-Cstrip=none").run(); + llvm_nm().input(binary).run().assert_stdout_contains(test_symbol); + if do_debuginfo_check { + llvm_dwarfdump().input(binary).run().assert_stdout_contains(dwarf_indicator); + } + + // -Cstrip=debuginfo should preserve symbols and strip debuginfo. + rustc().arg("hello.rs").arg("-Cdebuginfo=2").arg("-Cstrip=debuginfo").run(); + llvm_nm().input(binary).run().assert_stdout_contains(test_symbol); + if do_debuginfo_check { + llvm_dwarfdump().input(binary).run().assert_stdout_not_contains(dwarf_indicator); + } + + // -Cstrip=symbols should strip symbols and strip debuginfo. + rustc().arg("hello.rs").arg("-Cdebuginfo=2").arg("-Cstrip=symbols").run(); + llvm_nm().input(binary).run().assert_stderr_not_contains(test_symbol); + if do_debuginfo_check { + llvm_dwarfdump().input(binary).run().assert_stdout_not_contains(dwarf_indicator); + } +}