authorgravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2026-01-19 23:09:56+01:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2026-04-25 21:54:48+02:00
log1be84a39b8489c3d14d9233c288a505b69665caf
tree209ac4665178713a6fca1c0417926e7fc27a20eb
parenta8e624d7f1220da166a61c5eb5956a5569188856
signaturebadge-check Signed by SSH key SHA256:7B/LJ7bpR1eX8aCXSr4mtd5M45VMPKcx9zY8e95b5QM

compiler: fix and simplify DllMainCRTStartup handling

See: https://github.com/llvm/llvm-project/pull/171680

3 files changed, 6 insertions(+), 14 deletions(-)

lib/std/start.zig+4-3
......@@ -20,8 +20,9 @@ comptime {
2020 _ = root;
2121
2222 if (builtin.output_mode == .Lib and builtin.link_mode == .dynamic) {
23 if (native_os == .windows and !@hasDecl(root, "_DllMainCRTStartup")) {
24 @export(&_DllMainCRTStartup, .{ .name = "_DllMainCRTStartup" });
23 const dll_main_crt_startup = if (builtin.abi.isGnu()) "DllMainCRTStartup" else "_DllMainCRTStartup";
24 if (native_os == .windows and !builtin.link_libc and !@hasDecl(root, dll_main_crt_startup)) {
25 @export(&DllMainCRTStartup, .{ .name = dll_main_crt_startup });
2526 }
2627 } else if (builtin.output_mode == .Exe or @hasDecl(root, "main")) {
2728 if (builtin.link_libc and @hasDecl(root, "main")) {
......@@ -71,7 +72,7 @@ comptime {
7172 }
7273}
7374
74fn _DllMainCRTStartup(
75fn DllMainCRTStartup(
7576 hinstDLL: std.os.windows.HINSTANCE,
7677 fdwReason: std.os.windows.DWORD,
7778 lpReserved: std.os.windows.LPVOID,
src/codegen/llvm.zig+1
......@@ -1746,6 +1746,7 @@ pub const Object = struct {
17461746 if (name.eqlSlice("WinMainCRTStartup", ip)) flags.winmain_crt_startup = true;
17471747 if (name.eqlSlice("wWinMainCRTStartup", ip)) flags.wwinmain_crt_startup = true;
17481748 if (name.eqlSlice("DllMainCRTStartup", ip)) flags.dllmain_crt_startup = true;
1749 if (name.eqlSlice("_DllMainCRTStartup", ip)) flags.dllmain_crt_startup = true;
17491750 }
17501751 }
17511752
src/link/Lld.zig+1-11
......@@ -637,17 +637,7 @@ fn coffLink(lld: *Lld, arena: Allocator) !void {
637637 try argv.append("-ALTERNATENAME:__image_base__=__ImageBase");
638638 }
639639
640 if (is_dyn_lib) {
641 try argv.append(try comp.crtFileAsString(arena, "dllcrt2.obj"));
642 if (target.cpu.arch == .x86) {
643 try argv.append("-ALTERNATENAME:__DllMainCRTStartup@12=_DllMainCRTStartup@12");
644 } else {
645 try argv.append("-ALTERNATENAME:_DllMainCRTStartup=DllMainCRTStartup");
646 }
647 } else {
648 try argv.append(try comp.crtFileAsString(arena, "crt2.obj"));
649 }
650
640 try argv.append(try comp.crtFileAsString(arena, if (is_dyn_lib) "dllcrt2.obj" else "crt2.obj"));
651641 try argv.append(try comp.crtFileAsString(arena, "libmingw32.lib"));
652642 } else {
653643 try argv.append(switch (comp.config.link_mode) {