From 10e053dbb5c7ac3679044f222112682c9fc0758a Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Mon, 26 Jan 2026 10:34:50 -0800 Subject: [PATCH] Implement `set_output_kind` for Emscripten linker This makes cdylibs compile to working Emscripten dynamic libraries without passing extra RUSTFLAGS. This was previously approved as PR 98358 but there were CI failures that I never got around to fixing. --- compiler/rustc_codegen_ssa/src/back/linker.rs | 15 ++++++++++++++- .../src/spec/targets/wasm32_unknown_emscripten.rs | 2 ++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/compiler/rustc_codegen_ssa/src/back/linker.rs b/compiler/rustc_codegen_ssa/src/back/linker.rs index 1b75db51140b..db49f92e39ac 100644 --- a/compiler/rustc_codegen_ssa/src/back/linker.rs +++ b/compiler/rustc_codegen_ssa/src/back/linker.rs @@ -1208,10 +1208,23 @@ impl<'a> Linker for EmLinker<'a> { fn set_output_kind( &mut self, - _output_kind: LinkOutputKind, + output_kind: LinkOutputKind, _crate_type: CrateType, _out_filename: &Path, ) { + match output_kind { + LinkOutputKind::DynamicNoPicExe | LinkOutputKind::DynamicPicExe => { + self.cmd.arg("-sMAIN_MODULE=2"); + } + LinkOutputKind::DynamicDylib | LinkOutputKind::StaticDylib => { + self.cmd.arg("-sSIDE_MODULE=2"); + } + // -fno-pie is the default on Emscripten. + LinkOutputKind::StaticNoPicExe | LinkOutputKind::StaticPicExe => {} + LinkOutputKind::WasiReactorExe => { + unreachable!(); + } + } } fn link_dylib_by_name(&mut self, name: &str, _verbatim: bool, _as_needed: bool) { diff --git a/compiler/rustc_target/src/spec/targets/wasm32_unknown_emscripten.rs b/compiler/rustc_target/src/spec/targets/wasm32_unknown_emscripten.rs index 47623c34dce3..fb735b54dd82 100644 --- a/compiler/rustc_target/src/spec/targets/wasm32_unknown_emscripten.rs +++ b/compiler/rustc_target/src/spec/targets/wasm32_unknown_emscripten.rs @@ -19,6 +19,8 @@ pub(crate) fn target() -> Target { pre_link_args, post_link_args, relocation_model: RelocModel::Pic, + crt_static_respected: true, + crt_static_default: true, panic_strategy: PanicStrategy::Unwind, no_default_libraries: false, families: cvs!["unix", "wasm"],