]> git.lizzy.rs Git - rust.git/commitdiff
Generate a version script for linkers on Linux.
authorMichael Woerister <michaelwoerister@posteo.net>
Wed, 30 Nov 2016 18:16:53 +0000 (13:16 -0500)
committerMichael Woerister <michaelwoerister@posteo.net>
Mon, 5 Dec 2016 16:05:25 +0000 (11:05 -0500)
src/librustc_trans/back/linker.rs

index 933813ac4d9310ffb2bd08df487e8d7b727c14bf..67c8d268a819cecd868f651c051f41563dab2c0a 100644 (file)
@@ -253,46 +253,43 @@ fn export_symbols(&mut self, tmpdir: &Path, crate_type: CrateType) {
         let mut arg = OsString::new();
         let path = tmpdir.join("list");
 
-        if self.sess.target.target.options.is_like_solaris {
+        if self.sess.target.target.options.is_like_osx {
+            // Write a plain, newline-separated list of symbols
             let res = (|| -> io::Result<()> {
                 let mut f = BufWriter::new(File::create(&path)?);
-                writeln!(f, "{{\n  global:")?;
                 for sym in self.info.exports[&crate_type].iter() {
-                    writeln!(f, "    {};", sym)?;
+                    writeln!(f, "_{}", sym)?;
                 }
-                writeln!(f, "\n  local:\n    *;\n}};")?;
                 Ok(())
             })();
             if let Err(e) = res {
-                self.sess.fatal(&format!("failed to write version script: {}", e));
+                self.sess.fatal(&format!("failed to write lib.def file: {}", e));
             }
-
-            arg.push("-Wl,-M,");
-            arg.push(&path);
         } else {
-            let prefix = if self.sess.target.target.options.is_like_osx {
-                "_"
-            } else {
-                ""
-            };
+            // Write an LD version script
             let res = (|| -> io::Result<()> {
                 let mut f = BufWriter::new(File::create(&path)?);
+                writeln!(f, "{{\n  global:")?;
                 for sym in self.info.exports[&crate_type].iter() {
-                    writeln!(f, "{}{}", prefix, sym)?;
+                    writeln!(f, "    {};", sym)?;
                 }
+                writeln!(f, "\n  local:\n    *;\n}};")?;
                 Ok(())
             })();
             if let Err(e) = res {
-                self.sess.fatal(&format!("failed to write lib.def file: {}", e));
-            }
-            if self.sess.target.target.options.is_like_osx {
-                arg.push("-Wl,-exported_symbols_list,");
-            } else {
-                arg.push("-Wl,--retain-symbols-file=");
+                self.sess.fatal(&format!("failed to write version script: {}", e));
             }
-            arg.push(&path);
         }
 
+        if self.sess.target.target.options.is_like_osx {
+            arg.push("-Wl,-exported_symbols_list,");
+        } else if self.sess.target.target.options.is_like_solaris {
+            arg.push("-Wl,-M,");
+        } else {
+            arg.push("-Wl,--version-script=");
+        }
+
+        arg.push(&path);
         self.cmd.arg(arg);
     }