diff --git a/src/librustc_target/spec/linux_musl_base.rs b/src/librustc_target/spec/linux_musl_base.rs index 7a3f3c2a518..4594d450c15 100644 --- a/src/librustc_target/spec/linux_musl_base.rs +++ b/src/librustc_target/spec/linux_musl_base.rs @@ -58,6 +58,8 @@ pub fn opts() -> TargetOptions { // they'll be included from there. base.pre_link_objects_exe_crt.push("crt1.o".to_string()); base.pre_link_objects_exe_crt.push("crti.o".to_string()); + base.pre_link_objects_exe_crt_sys.push("crtbegin.o".to_string()); + base.post_link_objects_crt_sys.push("crtend.o".to_string()); base.post_link_objects_crt.push("crtn.o".to_string()); // These targets statically link libc by default diff --git a/src/librustc_target/spec/mod.rs b/src/librustc_target/spec/mod.rs index 57c7dd0992d..233d1560d73 100644 --- a/src/librustc_target/spec/mod.rs +++ b/src/librustc_target/spec/mod.rs @@ -423,19 +423,23 @@ pub struct TargetOptions { /// 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 + /// Objects to link before all others, all except *_sys found within the /// sysroot folder. pub pre_link_objects_exe: Vec, // ... when linking an executable, unconditionally pub pre_link_objects_exe_crt: Vec, // ... when linking an executable with a bundled crt + pub pre_link_objects_exe_crt_sys: Vec, // ... when linking an executable with a bundled + // crt, from the system library search path pub pre_link_objects_dll: Vec, // ... when linking a dylib /// Linker arguments that are unconditionally passed after any /// user-defined but before post_link_objects. Standard platform /// libraries that should be always be linked to, usually go here. pub late_link_args: LinkArgs, - /// Objects to link after all others, always found within the + /// Objects to link after all others, all except *_sys found within the /// sysroot folder. pub post_link_objects: Vec, // ... unconditionally pub post_link_objects_crt: Vec, // ... when linking with a bundled crt + pub post_link_objects_crt_sys: Vec, // ... when linking with a bundled crt, from the + // system library search path /// Linker arguments that are unconditionally passed *after* any /// user-defined libraries. pub post_link_args: LinkArgs, @@ -670,9 +674,11 @@ impl Default for TargetOptions { relro_level: RelroLevel::None, pre_link_objects_exe: Vec::new(), pre_link_objects_exe_crt: Vec::new(), + pre_link_objects_exe_crt_sys: Vec::new(), pre_link_objects_dll: Vec::new(), post_link_objects: Vec::new(), post_link_objects_crt: Vec::new(), + post_link_objects_crt_sys: Vec::new(), late_link_args: LinkArgs::new(), link_env: Vec::new(), archive_format: "gnu".to_string(), @@ -894,10 +900,12 @@ impl Target { key!(pre_link_args_crt, link_args); key!(pre_link_objects_exe, list); key!(pre_link_objects_exe_crt, list); + key!(pre_link_objects_exe_crt_sys, 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_objects_crt_sys, list); key!(post_link_args, link_args); key!(link_env, env); key!(asm_args, list); @@ -1102,10 +1110,12 @@ impl ToJson for Target { 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_exe_crt_sys); 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!(post_link_objects_crt_sys); target_option_val!(link_args - post_link_args); target_option_val!(env - link_env); target_option_val!(asm_args); diff --git a/src/librustc_trans/back/link.rs b/src/librustc_trans/back/link.rs index 67925178927..07dfeda3b5a 100644 --- a/src/librustc_trans/back/link.rs +++ b/src/librustc_trans/back/link.rs @@ -644,6 +644,12 @@ fn link_natively(sess: &Session, for obj in &sess.target.target.options.pre_link_objects_exe_crt { cmd.arg(root.join(obj)); } + + for obj in &sess.target.target.options.pre_link_objects_exe_crt_sys { + if flavor == LinkerFlavor::Gcc { + cmd.arg(format!("-l:{}", obj)); + } + } } if sess.target.target.options.is_like_emscripten { @@ -668,6 +674,11 @@ fn link_natively(sess: &Session, cmd.arg(root.join(obj)); } if sess.crt_static() { + for obj in &sess.target.target.options.post_link_objects_crt_sys { + if flavor == LinkerFlavor::Gcc { + cmd.arg(format!("-l:{}", obj)); + } + } for obj in &sess.target.target.options.post_link_objects_crt { cmd.arg(root.join(obj)); }