From edb091d66de8f59c4661cc2700c8f64e62b2f6aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Miku=C5=82a?= Date: Wed, 22 Jul 2026 14:24:31 +0200 Subject: [PATCH 1/4] gnullvm: always link libunwind statically --- compiler/rustc_target/src/spec/base/windows_gnullvm.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/compiler/rustc_target/src/spec/base/windows_gnullvm.rs b/compiler/rustc_target/src/spec/base/windows_gnullvm.rs index 5db5fb95924c5..28afb54aed358 100644 --- a/compiler/rustc_target/src/spec/base/windows_gnullvm.rs +++ b/compiler/rustc_target/src/spec/base/windows_gnullvm.rs @@ -13,13 +13,14 @@ pub(crate) fn opts() -> TargetOptions { // but LLVM maintainers rejected it: https://reviews.llvm.org/D51440 let pre_link_args = TargetOptions::link_args( LinkerFlavor::Gnu(Cc::Yes, Lld::No), - &["-nolibc", "--unwindlib=none"], + &["-nolibc", "--unwindlib=libunwind", "-static-libgcc"], ); // Order of `late_link_args*` does not matter with LLD. let mingw_libs = &["-lmingw32", "-lmingwex", "-lmsvcrt", "-lkernel32", "-luser32"]; let mut late_link_args = TargetOptions::link_args(LinkerFlavor::Gnu(Cc::No, Lld::No), mingw_libs); + add_link_args(&mut late_link_args, LinkerFlavor::Gnu(Cc::No, Lld::No), &["-l:libunwind.a"]); add_link_args(&mut late_link_args, LinkerFlavor::Gnu(Cc::Yes, Lld::No), mingw_libs); TargetOptions { From 089ea1c21a320957ca95855c2d7771ae2e41f3f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Miku=C5=82a?= Date: Wed, 22 Jul 2026 14:24:31 +0200 Subject: [PATCH 2/4] gnullvm: stop handling crt-static --- compiler/rustc_target/src/spec/base/windows_gnullvm.rs | 2 -- library/unwind/src/lib.rs | 5 ----- 2 files changed, 7 deletions(-) diff --git a/compiler/rustc_target/src/spec/base/windows_gnullvm.rs b/compiler/rustc_target/src/spec/base/windows_gnullvm.rs index 28afb54aed358..751927fcac0a7 100644 --- a/compiler/rustc_target/src/spec/base/windows_gnullvm.rs +++ b/compiler/rustc_target/src/spec/base/windows_gnullvm.rs @@ -47,8 +47,6 @@ pub(crate) fn opts() -> TargetOptions { eh_frame_header: false, no_default_libraries: false, has_thread_local: true, - crt_static_allows_dylibs: true, - crt_static_respected: true, debuginfo_kind: DebuginfoKind::Dwarf, // FIXME(davidtwco): Support Split DWARF on Windows GNU - may require LLVM changes to // output DWO, despite using DWARF, doesn't use ELF.. diff --git a/library/unwind/src/lib.rs b/library/unwind/src/lib.rs index 3725375a713dc..6d1707c078237 100644 --- a/library/unwind/src/lib.rs +++ b/library/unwind/src/lib.rs @@ -214,8 +214,3 @@ cfg_select! { #[cfg(target_os = "hurd")] #[link(name = "gcc_s")] unsafe extern "C" {} - -#[cfg(all(target_os = "windows", target_env = "gnu", target_abi = "llvm"))] -#[link(name = "unwind", kind = "static", modifiers = "-bundle", cfg(target_feature = "crt-static"))] -#[link(name = "unwind", cfg(not(target_feature = "crt-static")))] -unsafe extern "C" {} From 856c04aeb33cbbffa305c195bdd577cbd5cbdc3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Miku=C5=82a?= Date: Wed, 22 Jul 2026 14:24:31 +0200 Subject: [PATCH 3/4] gnullvm: stop shipping libunwind import lib --- src/bootstrap/src/core/build_steps/dist.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/bootstrap/src/core/build_steps/dist.rs b/src/bootstrap/src/core/build_steps/dist.rs index 9028a7a340ca7..e3d6d65b39603 100644 --- a/src/bootstrap/src/core/build_steps/dist.rs +++ b/src/bootstrap/src/core/build_steps/dist.rs @@ -323,7 +323,6 @@ fn make_win_llvm_dist(plat_root: &Path, target: TargetSelection, builder: &Build let target_libs = [ // MinGW libs "libunwind.a", - "libunwind.dll.a", "libmingw32.a", "libmingwex.a", "libmsvcrt.a", From 501c2826406dbe9ae21dd34ee4ab6be00506728a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Miku=C5=82a?= Date: Fri, 7 Aug 2026 18:32:09 +0200 Subject: [PATCH 4/4] gnullvm: document the need for static libunwind --- src/doc/rustc/src/platform-support/windows-gnullvm.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/doc/rustc/src/platform-support/windows-gnullvm.md b/src/doc/rustc/src/platform-support/windows-gnullvm.md index fccde2da99f55..80794294a994b 100644 --- a/src/doc/rustc/src/platform-support/windows-gnullvm.md +++ b/src/doc/rustc/src/platform-support/windows-gnullvm.md @@ -19,7 +19,7 @@ Target triples available so far: ## Requirements Building those targets requires an LLVM-based C toolchain, for example, [llvm-mingw][1] or [MSYS2][2] with CLANG* -environment. +environment, with static libunwind library available. Binaries for this target should be at least on par with `*-windows-gnu` in terms of requirements and functionality, except for implicit self-contained mode (explained in [the section below](#building-rust-programs)).