From fdea7da3e68b66514c7466696ecb6b034224ded0 Mon Sep 17 00:00:00 2001 From: qmuntal Date: Tue, 23 Sep 2025 18:19:47 +0200 Subject: [PATCH] runtime: use common library entry point on windows amd64/386 Windows can reuse the common library entry point instead of implementing a its own version. Note that windows/arm64 already uses the common one. Change-Id: I1a27bbec04bfd1d58a136638bafcdc0583bd106f Reviewed-on: https://go-review.googlesource.com/c/go/+/706235 LUCI-TryBot-Result: Go LUCI Reviewed-by: Cherry Mui Reviewed-by: Michael Pratt --- src/runtime/asm_amd64.s | 18 +++++++++++++++++- src/runtime/rt0_windows_386.s | 29 ++--------------------------- src/runtime/rt0_windows_amd64.s | 29 ++++------------------------- 3 files changed, 23 insertions(+), 53 deletions(-) diff --git a/src/runtime/asm_amd64.s b/src/runtime/asm_amd64.s index cf1d49a4ad..525df96f00 100644 --- a/src/runtime/asm_amd64.s +++ b/src/runtime/asm_amd64.s @@ -37,7 +37,12 @@ TEXT _rt0_amd64_lib(SB),NOSPLIT|NOFRAME,$0 MOVQ SI, _rt0_amd64_lib_argv<>(SB) // Synchronous initialization. +#ifndef GOOS_windows + // Avoid calling it on Windows because it is not used + // and it would crash the application due to the autogenerated + // ABI wrapper trying to access a non-existent TLS slot. CALL runtime·libpreinit(SB) +#endif // Create a new thread to finish Go runtime initialization. MOVQ _cgo_sys_thread_create(SB), AX @@ -45,12 +50,23 @@ TEXT _rt0_amd64_lib(SB),NOSPLIT|NOFRAME,$0 JZ nocgo // We're calling back to C. - // Align stack per ELF ABI requirements. + // Align stack per C ABI requirements. MOVQ SP, BX // Callee-save in C ABI ANDQ $~15, SP MOVQ $_rt0_amd64_lib_go(SB), DI MOVQ $0, SI +#ifdef GOOS_windows + // For Windows ABI + MOVQ DI, CX + MOVQ SI, DX + // Leave space for four words on the stack as required + // by the Windows amd64 calling convention. + ADJSP $32 +#endif CALL AX +#ifdef GOOS_windows + ADJSP $-32 // just to make the assembler not complain about unbalanced stack +#endif MOVQ BX, SP JMP restore diff --git a/src/runtime/rt0_windows_386.s b/src/runtime/rt0_windows_386.s index fa39edd787..bb92a99f6b 100644 --- a/src/runtime/rt0_windows_386.s +++ b/src/runtime/rt0_windows_386.s @@ -12,33 +12,8 @@ TEXT _rt0_386_windows(SB),NOSPLIT,$0 // library is loaded. For static libraries it is called when the // final executable starts, during the C runtime initialization // phase. -TEXT _rt0_386_windows_lib(SB),NOSPLIT,$0x1C - MOVL BP, 0x08(SP) - MOVL BX, 0x0C(SP) - MOVL AX, 0x10(SP) - MOVL CX, 0x14(SP) - MOVL DX, 0x18(SP) - - // Create a new thread to do the runtime initialization and return. - MOVL _cgo_sys_thread_create(SB), AX - MOVL $_rt0_386_windows_lib_go(SB), 0x00(SP) - MOVL $0, 0x04(SP) - - // Top two items on the stack are passed to _cgo_sys_thread_create - // as parameters. This is the calling convention on 32-bit Windows. - CALL AX - - MOVL 0x08(SP), BP - MOVL 0x0C(SP), BX - MOVL 0x10(SP), AX - MOVL 0x14(SP), CX - MOVL 0x18(SP), DX - RET - -TEXT _rt0_386_windows_lib_go(SB),NOSPLIT,$0 - PUSHL $0 - PUSHL $0 - JMP runtime·rt0_go(SB) +TEXT _rt0_386_windows_lib(SB),NOSPLIT,$0 + JMP _rt0_386_lib(SB) TEXT _main(SB),NOSPLIT,$0 // Remove the return address from the stack. diff --git a/src/runtime/rt0_windows_amd64.s b/src/runtime/rt0_windows_amd64.s index bd18bdd311..09869c534c 100644 --- a/src/runtime/rt0_windows_amd64.s +++ b/src/runtime/rt0_windows_amd64.s @@ -6,31 +6,10 @@ #include "go_tls.h" #include "textflag.h" -TEXT _rt0_amd64_windows(SB),NOSPLIT|NOFRAME,$-8 +TEXT _rt0_amd64_windows(SB),NOSPLIT,$0 JMP _rt0_amd64(SB) // When building with -buildmode=(c-shared or c-archive), this -// symbol is called. For dynamic libraries it is called when the -// library is loaded. For static libraries it is called when the -// final executable starts, during the C runtime initialization -// phase. -// Leave space for four pointers on the stack as required -// by the Windows amd64 calling convention. -TEXT _rt0_amd64_windows_lib(SB),NOSPLIT|NOFRAME,$40 - // Create a new thread to do the runtime initialization and return. - MOVQ BX, 32(SP) // callee-saved, preserved across the CALL - MOVQ SP, BX - ANDQ $~15, SP // alignment as per Windows requirement - MOVQ _cgo_sys_thread_create(SB), AX - MOVQ $_rt0_amd64_windows_lib_go(SB), CX - MOVQ $0, DX - CALL AX - MOVQ BX, SP - MOVQ 32(SP), BX - RET - -TEXT _rt0_amd64_windows_lib_go(SB),NOSPLIT|NOFRAME,$0 - MOVQ $0, DI - MOVQ $0, SI - MOVQ $runtime·rt0_go(SB), AX - JMP AX +// symbol is called. +TEXT _rt0_amd64_windows_lib(SB),NOSPLIT,$0 + JMP _rt0_amd64_lib(SB) -- 2.52.0