From bab6911f8a118fc342514bd3223158f10c8a8c32 Mon Sep 17 00:00:00 2001 From: Samuel Holland Date: Tue, 22 Aug 2017 16:24:29 -0500 Subject: [PATCH] Tell the linker when we want to link a static executable If the C runtime is linked statically, explicitly tell the linker that the executable should be static. --- src/librustc_trans/back/link.rs | 6 ++++-- src/librustc_trans/back/linker.rs | 10 ++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/librustc_trans/back/link.rs b/src/librustc_trans/back/link.rs index fb485e71d94..4e211d83cff 100644 --- a/src/librustc_trans/back/link.rs +++ b/src/librustc_trans/back/link.rs @@ -966,11 +966,13 @@ fn link_args(cmd: &mut Linker, add_upstream_rust_crates(cmd, sess, crate_type, tmpdir); add_upstream_native_libraries(cmd, sess, crate_type); - // # Telling the linker what we're doing - + // Tell the linker what we're doing. if crate_type != config::CrateTypeExecutable { cmd.build_dylib(out_filename); } + if crate_type == config::CrateTypeExecutable && sess.crt_static() { + cmd.build_static_executable(); + } // FIXME (#2397): At some point we want to rpath our guesses as to // where extern libraries might live, based on the diff --git a/src/librustc_trans/back/linker.rs b/src/librustc_trans/back/linker.rs index ab401465b56..9b0a5e3f4a5 100644 --- a/src/librustc_trans/back/linker.rs +++ b/src/librustc_trans/back/linker.rs @@ -110,6 +110,7 @@ pub trait Linker { fn debuginfo(&mut self); fn no_default_libraries(&mut self); fn build_dylib(&mut self, out_filename: &Path); + fn build_static_executable(&mut self); fn args(&mut self, args: &[String]); fn export_symbols(&mut self, tmpdir: &Path, crate_type: CrateType); fn subsystem(&mut self, subsystem: &str); @@ -179,6 +180,7 @@ impl<'a> Linker for GccLinker<'a> { fn position_independent_executable(&mut self) { self.cmd.arg("-pie"); } fn partial_relro(&mut self) { self.linker_arg("-z,relro"); } fn full_relro(&mut self) { self.linker_arg("-z,relro,-z,now"); } + fn build_static_executable(&mut self) { self.cmd.arg("-static"); } fn args(&mut self, args: &[String]) { self.cmd.args(args); } fn link_rust_dylib(&mut self, lib: &str, _path: &Path) { @@ -396,6 +398,10 @@ fn build_dylib(&mut self, out_filename: &Path) { self.cmd.arg(arg); } + fn build_static_executable(&mut self) { + // noop + } + fn gc_sections(&mut self, _keep_metadata: bool) { // MSVC's ICF (Identical COMDAT Folding) link optimization is // slow for Rust and thus we disable it by default when not in @@ -683,6 +689,10 @@ fn build_dylib(&mut self, _out_filename: &Path) { bug!("building dynamic library is unsupported on Emscripten") } + fn build_static_executable(&mut self) { + // noop + } + fn export_symbols(&mut self, _tmpdir: &Path, crate_type: CrateType) { let symbols = &self.info.exports[&crate_type];