From 0eb6876aed38547c59554bd289b050d6098b290b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Mon, 19 Jan 2026 23:09:56 +0100 Subject: [PATCH] compiler: fix and simplify DllMainCRTStartup handling See: https://github.com/llvm/llvm-project/pull/171680 --- lib/std/start.zig | 7 ++++--- src/codegen/llvm.zig | 1 + src/link/Lld.zig | 12 +----------- 3 files changed, 6 insertions(+), 14 deletions(-) diff --git a/lib/std/start.zig b/lib/std/start.zig index 9bc001fe59..6d748ba202 100644 --- a/lib/std/start.zig +++ b/lib/std/start.zig @@ -20,8 +20,9 @@ comptime { _ = root; if (builtin.output_mode == .Lib and builtin.link_mode == .dynamic) { - if (native_os == .windows and !@hasDecl(root, "_DllMainCRTStartup")) { - @export(&_DllMainCRTStartup, .{ .name = "_DllMainCRTStartup" }); + const dll_main_crt_startup = if (builtin.abi.isGnu()) "DllMainCRTStartup" else "_DllMainCRTStartup"; + if (native_os == .windows and !@hasDecl(root, dll_main_crt_startup)) { + @export(&DllMainCRTStartup, .{ .name = dll_main_crt_startup }); } } else if (builtin.output_mode == .Exe or @hasDecl(root, "main")) { if (builtin.link_libc and @hasDecl(root, "main")) { @@ -71,7 +72,7 @@ comptime { } } -fn _DllMainCRTStartup( +fn DllMainCRTStartup( hinstDLL: std.os.windows.HINSTANCE, fdwReason: std.os.windows.DWORD, lpReserved: std.os.windows.LPVOID, diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index b9a53360fe..d694291bb9 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -1648,6 +1648,7 @@ pub const Object = struct { if (name.eqlSlice("WinMainCRTStartup", ip)) flags.winmain_crt_startup = true; if (name.eqlSlice("wWinMainCRTStartup", ip)) flags.wwinmain_crt_startup = true; if (name.eqlSlice("DllMainCRTStartup", ip)) flags.dllmain_crt_startup = true; + if (name.eqlSlice("_DllMainCRTStartup", ip)) flags.dllmain_crt_startup = true; } } diff --git a/src/link/Lld.zig b/src/link/Lld.zig index a63793d36a..19fae5c868 100644 --- a/src/link/Lld.zig +++ b/src/link/Lld.zig @@ -637,17 +637,7 @@ fn coffLink(lld: *Lld, arena: Allocator) !void { try argv.append("-ALTERNATENAME:__image_base__=__ImageBase"); } - if (is_dyn_lib) { - try argv.append(try comp.crtFileAsString(arena, "dllcrt2.obj")); - if (target.cpu.arch == .x86) { - try argv.append("-ALTERNATENAME:__DllMainCRTStartup@12=_DllMainCRTStartup@12"); - } else { - try argv.append("-ALTERNATENAME:_DllMainCRTStartup=DllMainCRTStartup"); - } - } else { - try argv.append(try comp.crtFileAsString(arena, "crt2.obj")); - } - + try argv.append(try comp.crtFileAsString(arena, if (is_dyn_lib) "dllcrt2.obj" else "crt2.obj")); try argv.append(try comp.crtFileAsString(arena, "libmingw32.lib")); } else { try argv.append(switch (comp.config.link_mode) {