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
Comments
Is there any way for me to reproduce this problem? Regardless, please send your change, if you like, and I will review it.
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 |
Thank you for the report and suggestion for the change, @zhangyoufu! Thank you @alexbrainman for the response, and for imploring a CL; @zhangyoufu please go ahead, the tree for Go1.17 will open soon and it would be nice to have you as a contributor. Punting this to Go1.17. |
Change https://golang.org/cl/295329 mentions this issue: |
Windows amd64 calling convention requires 16-bytes aligned stack pointer. Before this patch, the real frame size is 0x48 (frame size) + 0x10 (frame pointer & return address), which does not satisfy the alignment requirement. _cgo_sys_thread_create eventually calls NtCreateThread, which receives a pointer to a ThreadContext structure allocated from (mis-aligned) stack, and may fail with STATUS_DATATYPE_MISALIGNMENT on some implementations. BP is saved/restored by prolog/epilog. AX, CX, DX are volatile, no need to save and restore. Fixes golang#41075
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).go/src/runtime/rt0_windows_amd64.s
Lines 12 to 37 in 73a5c37
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 withruntime: failed to create new OS thread (22)
, becauseNtCreateThread
does not accept an unalignedThreadContext
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.This works for me. I don't think this change will break JNI usage, as mentioned in #30944.
The text was updated successfully, but these errors were encountered: