diff options
| author | Nikita Baksalyar <nikita.baksalyar@gmail.com> | 2016-08-13 14:09:43 +0500 |
|---|---|---|
| committer | Nikita Baksalyar <nikita.baksalyar@gmail.com> | 2016-08-20 12:19:07 +0500 |
| commit | c08b7b9f754c6969e3cc630cfea76a8b8ce8876b (patch) | |
| tree | 5fa4bcf7360005e4b3e39b4e98c768cd04d7b3f2 | |
| parent | 413ada30402f823a86a75578afc63d07179f6a23 (diff) | |
| download | rust-c08b7b9f754c6969e3cc630cfea76a8b8ce8876b.tar.gz rust-c08b7b9f754c6969e3cc630cfea76a8b8ce8876b.zip | |
Fix linker on Solaris/Illumos
Solaris linker doesn't support the `--retain-symbols-file` option, so this patch provides version scripts as an alternative on that platform.
| -rw-r--r-- | src/librustc_trans/back/linker.rs | 58 |
1 files changed, 39 insertions, 19 deletions
diff --git a/src/librustc_trans/back/linker.rs b/src/librustc_trans/back/linker.rs index cb990ead8e8..f2d5b128d27 100644 --- a/src/librustc_trans/back/linker.rs +++ b/src/librustc_trans/back/linker.rs @@ -247,29 +247,49 @@ impl<'a> Linker for GnuLinker<'a> { return } + let mut arg = OsString::new(); let path = tmpdir.join("list"); - let prefix = if self.sess.target.target.options.is_like_osx { - "_" - } else { - "" - }; - let res = (|| -> io::Result<()> { - let mut f = BufWriter::new(File::create(&path)?); - for sym in &self.info.cdylib_exports { - writeln!(f, "{}{}", prefix, sym)?; + + if self.sess.target.target.options.is_like_solaris { + let res = (|| -> io::Result<()> { + let mut f = BufWriter::new(File::create(&path)?); + writeln!(f, "{{\n global:")?; + for sym in &self.info.cdylib_exports { + 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)); } - Ok(()) - })(); - if let Err(e) = res { - self.sess.fatal(&format!("failed to write lib.def file: {}", e)); - } - let mut arg = OsString::new(); - if self.sess.target.target.options.is_like_osx { - arg.push("-Wl,-exported_symbols_list,"); + + arg.push("-Wl,-M,"); + arg.push(&path); } else { - arg.push("-Wl,--retain-symbols-file="); + let prefix = if self.sess.target.target.options.is_like_osx { + "_" + } else { + "" + }; + let res = (|| -> io::Result<()> { + let mut f = BufWriter::new(File::create(&path)?); + for sym in &self.info.cdylib_exports { + writeln!(f, "{}{}", prefix, sym)?; + } + 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="); + } + arg.push(&path); } - arg.push(&path); + self.cmd.arg(arg); } } |
