From 6de338b45f2b5cfe6dc92045e1b2c4ba4e829572 Mon Sep 17 00:00:00 2001 From: bjorn3 <17426603+bjorn3@users.noreply.github.com> Date: Sat, 9 Aug 2025 16:18:03 +0000 Subject: [PATCH 1/2] Enable limit_rdylib_exports on Solaris This (poorly named) target option controls whether or not cdylibs will export mangled rust symbols rather than just unmangled symbols. Presumably at some point in the past support for this wasn't implemented yet for Solaris, but cg_ssa::back::linker does have handling for this on Solaris now. And one of the Solaris target maintainers confirmed that building Rust with this option enabled works fine for them on Solaris. --- compiler/rustc_target/src/spec/base/solaris.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/compiler/rustc_target/src/spec/base/solaris.rs b/compiler/rustc_target/src/spec/base/solaris.rs index 22288b86e2ecd..dc66ffcfa4563 100644 --- a/compiler/rustc_target/src/spec/base/solaris.rs +++ b/compiler/rustc_target/src/spec/base/solaris.rs @@ -8,7 +8,6 @@ pub(crate) fn opts() -> TargetOptions { families: cvs!["unix"], is_like_solaris: true, linker_flavor: LinkerFlavor::Unix(Cc::Yes), - limit_rdylib_exports: false, // Linker doesn't support this eh_frame_header: false, ..Default::default() From 7678cd2dfbba2b89aa581ecb881f1f8510c2f3c7 Mon Sep 17 00:00:00 2001 From: bjorn3 <17426603+bjorn3@users.noreply.github.com> Date: Wed, 13 Aug 2025 14:06:56 +0000 Subject: [PATCH 2/2] Create a proper mapfile on Solaris for limiting symbol visibility --- compiler/rustc_codegen_ssa/src/back/linker.rs | 32 ++++++++++++++----- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/compiler/rustc_codegen_ssa/src/back/linker.rs b/compiler/rustc_codegen_ssa/src/back/linker.rs index df1e91b12f904..5ff6053cd4f2b 100644 --- a/compiler/rustc_codegen_ssa/src/back/linker.rs +++ b/compiler/rustc_codegen_ssa/src/back/linker.rs @@ -828,7 +828,27 @@ impl<'a> Linker for GccLinker<'a> { self.sess.dcx().emit_fatal(errors::LibDefWriteFailure { error }); } self.link_arg(path); - } else if crate_type == CrateType::Executable && !self.sess.target.is_like_solaris { + } else if self.sess.target.is_like_solaris { + // Write a Solaris LD mapfile + // Documented at https://docs.oracle.com/cd/E53394_01/html/E54813/gjpky.html#OSLLGman-scsvd + let res: io::Result<()> = try { + let mut f = File::create_buffered(&path)?; + writeln!(f, "$mapfile_version 2")?; + writeln!(f, "SYMBOL_SCOPE {{")?; + if !symbols.is_empty() { + writeln!(f, " global:")?; + for (sym, _) in symbols { + debug!(" {sym};"); + writeln!(f, " {sym};")?; + } + } + writeln!(f, "\n local:\n *;\n}};")?; + }; + if let Err(error) = res { + self.sess.dcx().emit_fatal(errors::VersionScriptWriteFailure { error }); + } + self.link_arg("-M").link_arg(path); + } else if crate_type == CrateType::Executable { let res: io::Result<()> = try { let mut f = File::create_buffered(&path)?; writeln!(f, "{{")?; @@ -859,13 +879,9 @@ impl<'a> Linker for GccLinker<'a> { if let Err(error) = res { self.sess.dcx().emit_fatal(errors::VersionScriptWriteFailure { error }); } - if self.sess.target.is_like_solaris { - self.link_arg("-M").link_arg(path); - } else { - let mut arg = OsString::from("--version-script="); - arg.push(path); - self.link_arg(arg).link_arg("--no-undefined-version"); - } + let mut arg = OsString::from("--version-script="); + arg.push(path); + self.link_arg(arg).link_arg("--no-undefined-version"); } }