From: Michael Woerister Date: Wed, 30 Nov 2016 18:16:53 +0000 (-0500) Subject: Generate a version script for linkers on Linux. X-Git-Url: https://git.lizzy.rs/?a=commitdiff_plain;h=e48160f6e40352a7f72ab108e78754ef1f3f5da1;p=rust.git Generate a version script for linkers on Linux. --- diff --git a/src/librustc_trans/back/linker.rs b/src/librustc_trans/back/linker.rs index 933813ac4d9..67c8d268a81 100644 --- a/src/librustc_trans/back/linker.rs +++ b/src/librustc_trans/back/linker.rs @@ -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); }