Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

runtime: _rt0_amd64_windows_lib stack frame not aligned, violates Microsoft x64 ABI #41075

Open
zhangyoufu opened this issue Aug 27, 2020 · 1 comment

Comments

@zhangyoufu
Copy link

@zhangyoufu zhangyoufu commented Aug 27, 2020

The actual frame size of _rt0_amd64_windows_lib is 0x58 (incl. return address and saved rbp), which does not conform to Microsoft x64 ABI (align to 0x10).

// 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,$0x48
MOVQ BP, 0x20(SP)
MOVQ BX, 0x28(SP)
MOVQ AX, 0x30(SP)
MOVQ CX, 0x38(SP)
MOVQ DX, 0x40(SP)
// Create a new thread to do the runtime initialization and return.
MOVQ _cgo_sys_thread_create(SB), AX
MOVQ $_rt0_amd64_windows_lib_go(SB), CX
MOVQ $0, DX
CALL AX
MOVQ 0x20(SP), BP
MOVQ 0x28(SP), BX
MOVQ 0x30(SP), AX
MOVQ 0x38(SP), CX
MOVQ 0x40(SP), DX
RET

I ran into this issue when I managed to run latest Go on Windows Server 2003 x64 (unsupported, yes I know). misc/cgo/testcarchive failed with runtime: failed to create new OS thread (22), because NtCreateThread does not accept an unaligned ThreadContext pointer (at 0xXXXXXX8).

Save and restore these registers looks strange for me. RBX is callee-saved, but we didn't tamper it. RAX/RCX/RDX are volatile, we don't have to save and restore them.

TEXT _rt0_amd64_windows_lib(SB),NOSPLIT|NOFRAME,$0
        // Create a new thread to do the runtime initialization and return.
        MOVQ    $_rt0_amd64_windows_lib_go(SB), CX
        MOVQ    $0, DX
        MOVQ    _cgo_sys_thread_create(SB), AX
        JMP     AX

This works for me. I don't think this change will break JNI usage, as mentioned in #30944.

@alexbrainman
Copy link
Member

@alexbrainman alexbrainman commented Sep 12, 2020

I ran into this issue when I managed to run latest Go on Windows Server 2003 x64 (unsupported, yes I know). misc/cgo/testcarchive failed with runtime: failed to create new OS thread (22), because NtCreateThread does not accept an unaligned ThreadContext pointer (at 0xXXXXXX8).

Is there any way for me to reproduce this problem? Regardless, please send your change, if you like, and I will review it.

Save and restore these registers looks strange for me. RBX is callee-saved, but we didn't tamper it. RAX/RCX/RDX are volatile, we don't have to save and restore them.

We definitely need to leave 4 words on stack for AX, BX. DX and CX. I agree we don't need to restore BX. DX and CX. I am not familiar with BP here. But I suggest you leave code alone as is, just add code to align stack before CreateThread.

Thank you.

Alex

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Linked pull requests

Successfully merging a pull request may close this issue.

None yet
3 participants
You can’t perform that action at this time.