diff options
| author | bors <bors@rust-lang.org> | 2015-09-22 09:19:47 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2015-09-22 09:19:47 +0000 |
| commit | f17cc4cf045dcb8e8fb3e2060eb0ec0681e6c08f (patch) | |
| tree | 54f9c97aa72cfe99c3f55cd5eec9141ea4e33073 | |
| parent | 0b089cd2d537e2fbf0ccbd7590af138086558eb5 (diff) | |
| parent | 920f32becd5d54864a966900963a376d74d09922 (diff) | |
| download | rust-f17cc4cf045dcb8e8fb3e2060eb0ec0681e6c08f.tar.gz rust-f17cc4cf045dcb8e8fb3e2060eb0ec0681e6c08f.zip | |
Auto merge of #28578 - gandro:nodefaultlibs, r=alexcrichton
This patch basically adds a target option for omitting the `-nodefaultlibs` flag when invoking the linker. I am not sure if this is the correct or only way to approach this problem, so any feedback is welcome. Motivation: I'm currently working on a Rust target specification for the [rumprun](/rumpkernel/rumprun) unikernel. rumprun is based on rump kernels and uses NetBSDs libc and drivers to provide a POSIXy environment. It provides its own linker wrapper that generates binaries which can be "baked" into a unikernel after configuration. Using `-nodefaultlibs` on the rumprun linker will prevent it from selecting the search paths for the rumprun libraries. My current target implementation for rumprun is here: gandro/rust@295744b2ee2378f41a20d4b498b8f1991a75e93c Currently, only a target that `is_like_windows` will omit the `-nodefaultlibs` flag, but since rumprun is not like Windows otherwise, I think a separate flag makes more sense. This might be a breaking change for target specifications that have the `is_like_windows` option set to true. Such targets need to set `no_default_libraries` to false in order to restore the old behavior.
| -rw-r--r-- | src/librustc_back/target/mod.rs | 5 | ||||
| -rw-r--r-- | src/librustc_back/target/windows_base.rs | 4 | ||||
| -rw-r--r-- | src/librustc_trans/back/link.rs | 4 | ||||
| -rw-r--r-- | src/librustc_trans/back/linker.rs | 7 |
4 files changed, 13 insertions, 7 deletions
diff --git a/src/librustc_back/target/mod.rs b/src/librustc_back/target/mod.rs index 56562c8dfdb..e7c1c3fb258 100644 --- a/src/librustc_back/target/mod.rs +++ b/src/librustc_back/target/mod.rs @@ -157,6 +157,9 @@ pub struct TargetOptions { /// Whether to disable linking to compiler-rt. Defaults to false, as LLVM /// will emit references to the functions that compiler-rt provides. pub no_compiler_rt: bool, + /// Whether to disable linking to the default libraries, typically corresponds + /// to `-nodefaultlibs`. Defaults to true. + pub no_default_libraries: bool, /// Dynamically linked executables can be compiled as position independent /// if the default relocation model of position independent code is not /// changed. This is a requirement to take advantage of ASLR, as otherwise @@ -212,6 +215,7 @@ impl Default for TargetOptions { linker_is_gnu: false, has_rpath: false, no_compiler_rt: false, + no_default_libraries: true, position_independent_executables: false, pre_link_objects: Vec::new(), post_link_objects: Vec::new(), @@ -319,6 +323,7 @@ impl Target { key!(linker_is_gnu, bool); key!(has_rpath, bool); key!(no_compiler_rt, bool); + key!(no_default_libraries, bool); key!(pre_link_args, list); key!(post_link_args, list); key!(allow_asm, bool); diff --git a/src/librustc_back/target/windows_base.rs b/src/librustc_back/target/windows_base.rs index fedae51e0e8..8d089bb43ad 100644 --- a/src/librustc_back/target/windows_base.rs +++ b/src/librustc_back/target/windows_base.rs @@ -23,6 +23,10 @@ pub fn opts() -> TargetOptions { exe_suffix: ".exe".to_string(), staticlib_prefix: "".to_string(), staticlib_suffix: ".lib".to_string(), + // Unfortunately right now passing -nodefaultlibs to gcc on windows + // doesn't work so hot (in terms of native dependencies). This flag + // should hopefully be removed one day though! + no_default_libraries: false, is_like_windows: true, archive_format: "gnu".to_string(), pre_link_args: vec!( diff --git a/src/librustc_trans/back/link.rs b/src/librustc_trans/back/link.rs index f1997054fa3..f25132e1856 100644 --- a/src/librustc_trans/back/link.rs +++ b/src/librustc_trans/back/link.rs @@ -970,7 +970,9 @@ fn link_args(cmd: &mut Linker, // default. Note that this does not happen for windows because windows pulls // in some large number of libraries and I couldn't quite figure out which // subset we wanted. - cmd.no_default_libraries(); + if t.options.no_default_libraries { + cmd.no_default_libraries(); + } // Take careful note of the ordering of the arguments we pass to the linker // here. Linkers will assume that things on the left depend on things to the diff --git a/src/librustc_trans/back/linker.rs b/src/librustc_trans/back/linker.rs index a4333dc10d6..d6c12f864c4 100644 --- a/src/librustc_trans/back/linker.rs +++ b/src/librustc_trans/back/linker.rs @@ -159,12 +159,7 @@ impl<'a> Linker for GnuLinker<'a> { } fn no_default_libraries(&mut self) { - // Unfortunately right now passing -nodefaultlibs to gcc on windows - // doesn't work so hot (in terms of native dependencies). This if - // statement should hopefully be removed one day though! - if !self.sess.target.target.options.is_like_windows { - self.cmd.arg("-nodefaultlibs"); - } + self.cmd.arg("-nodefaultlibs"); } fn build_dylib(&mut self, out_filename: &Path) { |
