From 8dca5cba5d94ebee84ae33d7f6ed4094c1ae95a8 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: link libunwind statically by default --- compiler/rustc_target/src/spec/base/windows_gnullvm.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/compiler/rustc_target/src/spec/base/windows_gnullvm.rs b/compiler/rustc_target/src/spec/base/windows_gnullvm.rs index 5db5fb95924c5..25c7a849d78ce 100644 --- a/compiler/rustc_target/src/spec/base/windows_gnullvm.rs +++ b/compiler/rustc_target/src/spec/base/windows_gnullvm.rs @@ -48,6 +48,7 @@ pub(crate) fn opts() -> TargetOptions { has_thread_local: true, crt_static_allows_dylibs: true, crt_static_respected: true, + crt_static_default: 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.. From a7a3d253b00060ae86c3b7eb698bd6902b128f7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Miku=C5=82a?= Date: Thu, 23 Jul 2026 21:00:06 +0200 Subject: [PATCH 2/4] Do not pass `--no-pie` on Windows --- compiler/rustc_codegen_ssa/src/back/linker.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/rustc_codegen_ssa/src/back/linker.rs b/compiler/rustc_codegen_ssa/src/back/linker.rs index 50a3e7fb7a1d1..4a141b0cad93d 100644 --- a/compiler/rustc_codegen_ssa/src/back/linker.rs +++ b/compiler/rustc_codegen_ssa/src/back/linker.rs @@ -536,7 +536,7 @@ impl<'a> Linker for GccLinker<'a> { LinkOutputKind::StaticNoPicExe => { // `-static` works for both gcc wrapper and ld. self.link_or_cc_arg("-static"); - if !self.is_ld && self.is_gnu { + if !self.is_ld && self.is_gnu && !self.sess.target.is_like_windows { self.cc_arg("-no-pie"); } } From 8fd3898cca0e41abd9b45ddc8520efdb31589caf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Miku=C5=82a?= Date: Mon, 3 Aug 2026 20:15:52 +0200 Subject: [PATCH 3/4] wip: always static --- compiler/rustc_target/src/spec/base/windows_gnullvm.rs | 6 ++---- library/unwind/src/lib.rs | 5 ----- src/bootstrap/src/core/build_steps/compile.rs | 1 + 3 files changed, 3 insertions(+), 9 deletions(-) diff --git a/compiler/rustc_target/src/spec/base/windows_gnullvm.rs b/compiler/rustc_target/src/spec/base/windows_gnullvm.rs index 25c7a849d78ce..751927fcac0a7 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 { @@ -46,9 +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, - crt_static_default: 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" {} diff --git a/src/bootstrap/src/core/build_steps/compile.rs b/src/bootstrap/src/core/build_steps/compile.rs index 021a652a5ac50..c91b883d0fb84 100644 --- a/src/bootstrap/src/core/build_steps/compile.rs +++ b/src/bootstrap/src/core/build_steps/compile.rs @@ -357,6 +357,7 @@ fn copy_third_party_objects( } if target == "x86_64-fortanix-unknown-sgx" + || target.ends_with("windows-gnullvm") || builder.config.llvm_libunwind(target) == LlvmLibunwind::InTree && (target.contains("linux") || target.contains("fuchsia") From 2f44eafae9d0ee076b764f05962da7f217d188d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Miku=C5=82a?= Date: Wed, 5 Aug 2026 13:17:56 +0200 Subject: [PATCH 4/4] Add libunwind's src directory to include search paths Annoyingly some of the headers are put in `src/` rather than `include/`. --- src/bootstrap/src/core/build_steps/llvm.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/bootstrap/src/core/build_steps/llvm.rs b/src/bootstrap/src/core/build_steps/llvm.rs index d3276cfb5371b..264a6fd44cde3 100644 --- a/src/bootstrap/src/core/build_steps/llvm.rs +++ b/src/bootstrap/src/core/build_steps/llvm.rs @@ -1751,6 +1751,7 @@ impl CommandLineStep for Libunwind { cfg.define("_LIBUNWIND_DISABLE_VISIBILITY_ANNOTATIONS", None); cfg.define("_LIBUNWIND_IS_NATIVE_ONLY", "1"); cfg.include(root.join("include")); + cfg.include(root.join("src")); cfg.cargo_metadata(false); cfg.out_dir(&out_dir);