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
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
// 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.
#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)