diff options
| author | Johannes Nixdorf <mixi@exherbo.org> | 2018-04-29 11:17:54 +0200 |
|---|---|---|
| committer | Johannes Nixdorf <mixi@exherbo.org> | 2018-05-31 12:01:50 +0200 |
| commit | bf3b8df697f1ce84e24cd29119ea8dd0e152dbd9 (patch) | |
| tree | f37c2efcdf46ca688197f04ec150952484e69606 | |
| parent | a47b2d09d6caa5aeb5a7f6128869bd6eb12418d2 (diff) | |
| download | rust-bf3b8df697f1ce84e24cd29119ea8dd0e152dbd9.tar.gz rust-bf3b8df697f1ce84e24cd29119ea8dd0e152dbd9.zip | |
musl: don't use the included startfiles with -crt-static
This fixes (only for -crt-static) #36710.
| -rw-r--r-- | src/librustc_codegen_llvm/back/link.rs | 16 | ||||
| -rw-r--r-- | src/librustc_target/spec/linux_musl_base.rs | 9 | ||||
| -rw-r--r-- | src/librustc_target/spec/mod.rs | 21 |
3 files changed, 37 insertions, 9 deletions
diff --git a/src/librustc_codegen_llvm/back/link.rs b/src/librustc_codegen_llvm/back/link.rs index 735c4d2f76f..4e9910e58f3 100644 --- a/src/librustc_codegen_llvm/back/link.rs +++ b/src/librustc_codegen_llvm/back/link.rs @@ -625,6 +625,11 @@ fn link_natively(sess: &Session, if let Some(args) = sess.target.target.options.pre_link_args.get(&flavor) { cmd.args(args); } + if let Some(args) = sess.target.target.options.pre_link_args_crt.get(&flavor) { + if sess.crt_static() { + cmd.args(args); + } + } if let Some(ref args) = sess.opts.debugging_opts.pre_link_args { cmd.args(args); } @@ -639,6 +644,12 @@ fn link_natively(sess: &Session, cmd.arg(root.join(obj)); } + if crate_type == config::CrateTypeExecutable && sess.crt_static() { + for obj in &sess.target.target.options.pre_link_objects_exe_crt { + cmd.arg(root.join(obj)); + } + } + if sess.target.target.options.is_like_emscripten { cmd.arg("-s"); cmd.arg(if sess.panic_strategy() == PanicStrategy::Abort { @@ -660,6 +671,11 @@ fn link_natively(sess: &Session, for obj in &sess.target.target.options.post_link_objects { cmd.arg(root.join(obj)); } + if sess.crt_static() { + for obj in &sess.target.target.options.post_link_objects_crt { + cmd.arg(root.join(obj)); + } + } if let Some(args) = sess.target.target.options.post_link_args.get(&flavor) { cmd.args(args); } diff --git a/src/librustc_target/spec/linux_musl_base.rs b/src/librustc_target/spec/linux_musl_base.rs index 293f23eab38..7a3f3c2a518 100644 --- a/src/librustc_target/spec/linux_musl_base.rs +++ b/src/librustc_target/spec/linux_musl_base.rs @@ -15,7 +15,8 @@ pub fn opts() -> TargetOptions { // Make sure that the linker/gcc really don't pull in anything, including // default objects, libs, etc. - base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-nostdlib".to_string()); + base.pre_link_args_crt.insert(LinkerFlavor::Gcc, Vec::new()); + base.pre_link_args_crt.get_mut(&LinkerFlavor::Gcc).unwrap().push("-nostdlib".to_string()); // At least when this was tested, the linker would not add the // `GNU_EH_FRAME` program header to executables generated, which is required @@ -55,9 +56,9 @@ pub fn opts() -> TargetOptions { // // Each target directory for musl has these object files included in it so // they'll be included from there. - base.pre_link_objects_exe.push("crt1.o".to_string()); - base.pre_link_objects_exe.push("crti.o".to_string()); - base.post_link_objects.push("crtn.o".to_string()); + base.pre_link_objects_exe_crt.push("crt1.o".to_string()); + base.pre_link_objects_exe_crt.push("crti.o".to_string()); + base.post_link_objects_crt.push("crtn.o".to_string()); // These targets statically link libc by default base.crt_static_default = true; diff --git a/src/librustc_target/spec/mod.rs b/src/librustc_target/spec/mod.rs index a0cbfe2fefa..e54cd773123 100644 --- a/src/librustc_target/spec/mod.rs +++ b/src/librustc_target/spec/mod.rs @@ -426,12 +426,13 @@ pub struct TargetOptions { /// Linker to invoke pub linker: Option<String>, - /// Linker arguments that are unconditionally passed *before* any - /// user-defined libraries. - pub pre_link_args: LinkArgs, + /// Linker arguments that are passed *before* any user-defined libraries. + pub pre_link_args: LinkArgs, // ... unconditionally + pub pre_link_args_crt: LinkArgs, // ... when linking with a bundled crt /// Objects to link before all others, always found within the /// sysroot folder. - pub pre_link_objects_exe: Vec<String>, // ... when linking an executable + pub pre_link_objects_exe: Vec<String>, // ... when linking an executable, unconditionally + pub pre_link_objects_exe_crt: Vec<String>, // ... when linking an executable with a bundled crt pub pre_link_objects_dll: Vec<String>, // ... when linking a dylib /// Linker arguments that are unconditionally passed after any /// user-defined but before post_link_objects. Standard platform @@ -439,7 +440,8 @@ pub struct TargetOptions { pub late_link_args: LinkArgs, /// Objects to link after all others, always found within the /// sysroot folder. - pub post_link_objects: Vec<String>, + pub post_link_objects: Vec<String>, // ... unconditionally + pub post_link_objects_crt: Vec<String>, // ... when linking with a bundled crt /// Linker arguments that are unconditionally passed *after* any /// user-defined libraries. pub post_link_args: LinkArgs, @@ -639,6 +641,7 @@ impl Default for TargetOptions { is_builtin: false, linker: option_env!("CFG_DEFAULT_LINKER").map(|s| s.to_string()), pre_link_args: LinkArgs::new(), + pre_link_args_crt: LinkArgs::new(), post_link_args: LinkArgs::new(), asm_args: Vec::new(), cpu: "generic".to_string(), @@ -672,8 +675,10 @@ impl Default for TargetOptions { position_independent_executables: false, relro_level: RelroLevel::None, pre_link_objects_exe: Vec::new(), + pre_link_objects_exe_crt: Vec::new(), pre_link_objects_dll: Vec::new(), post_link_objects: Vec::new(), + post_link_objects_crt: Vec::new(), late_link_args: LinkArgs::new(), link_env: Vec::new(), archive_format: "gnu".to_string(), @@ -892,10 +897,13 @@ impl Target { key!(is_builtin, bool); key!(linker, optional); key!(pre_link_args, link_args); + key!(pre_link_args_crt, link_args); key!(pre_link_objects_exe, list); + key!(pre_link_objects_exe_crt, list); key!(pre_link_objects_dll, list); key!(late_link_args, link_args); key!(post_link_objects, list); + key!(post_link_objects_crt, list); key!(post_link_args, link_args); key!(link_env, env); key!(asm_args, list); @@ -1097,10 +1105,13 @@ impl ToJson for Target { target_option_val!(is_builtin); target_option_val!(linker); target_option_val!(link_args - pre_link_args); + target_option_val!(link_args - pre_link_args_crt); target_option_val!(pre_link_objects_exe); + target_option_val!(pre_link_objects_exe_crt); target_option_val!(pre_link_objects_dll); target_option_val!(link_args - late_link_args); target_option_val!(post_link_objects); + target_option_val!(post_link_objects_crt); target_option_val!(link_args - post_link_args); target_option_val!(env - link_env); target_option_val!(asm_args); |
