diff --git a/src/librustc/session/config.rs b/src/librustc/session/config.rs index f41765b642d..31795d0ff4c 100644 --- a/src/librustc/session/config.rs +++ b/src/librustc/session/config.rs @@ -1294,6 +1294,8 @@ options! {DebuggingOptions, DebuggingSetter, basic_debugging_options, "format compiler diagnostics in a way that's better suitable for UI testing"), embed_bitcode: bool = (false, parse_bool, [TRACKED], "embed LLVM bitcode in object files"), + strip_debuginfo_if_disabled: Option = (None, parse_opt_bool, [TRACKED], + "tell the linker to strip debuginfo when building without debuginfo enabled."), } pub fn default_lib_output() -> CrateType { diff --git a/src/librustc_trans/back/linker.rs b/src/librustc_trans/back/linker.rs index 9bd7d83a191..53a9dd6a76f 100644 --- a/src/librustc_trans/back/linker.rs +++ b/src/librustc_trans/back/linker.rs @@ -281,7 +281,18 @@ impl<'a> Linker for GccLinker<'a> { } fn debuginfo(&mut self) { - // Don't do anything special here for GNU-style linkers. + match self.sess.opts.debuginfo { + DebugInfoLevel::NoDebugInfo => { + // If we are building without debuginfo enabled and we were called with + // `-Zstrip-debuginfo-if-disabled=yes`, tell the linker to strip any debuginfo + // found when linking to get rid of symbols from libstd. + match self.sess.opts.debugging_opts.strip_debuginfo_if_disabled { + Some(true) => { self.linker_arg("-S"); }, + _ => {}, + } + }, + _ => {}, + }; } fn no_default_libraries(&mut self) {