]> git.lizzy.rs Git - rust.git/commitdiff
musl: link crt{begin,end}.o from the system compiler
authorJohannes Nixdorf <mixi@exherbo.org>
Sun, 29 Apr 2018 09:29:05 +0000 (11:29 +0200)
committerJohannes Nixdorf <mixi@exherbo.org>
Tue, 1 May 2018 13:38:41 +0000 (15:38 +0200)
This fixes #36710 with +crt-static. We only need to add crtbegin.o and
crtend.o as we only do static linking with the bundled start files and
there is no static-pie support in rustc yet.

src/librustc_target/spec/linux_musl_base.rs
src/librustc_target/spec/mod.rs
src/librustc_trans/back/link.rs

index 7a3f3c2a518bc7d065602ce42d30d3f9abc1ad1e..4594d450c1507f7a05dbd9078d0f3c9d90dab2c4 100644 (file)
@@ -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
index 57c7dd0992d6840a8d06627614483846c85b4f83..233d1560d73d47b44a6fb8a7c7e5724bfda6a991 100644 (file)
@@ -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<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_exe_crt_sys: Vec<String>, // ... when linking an executable with a bundled
+                                                   //  crt, from the system library search path
     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
     /// 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<String>, // ... unconditionally
     pub post_link_objects_crt: Vec<String>, // ... when linking with a bundled crt
+    pub post_link_objects_crt_sys: Vec<String>, // ... 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 @@ fn default() -> 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 @@ macro_rules! key {
         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 @@ macro_rules! target_option_val {
         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);
index 67925178927e609aa25684e951b4827f95f2a968..07dfeda3b5a3122c776c70f122bfc8fcacb74501 100644 (file)
@@ -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));
         }