Join GitHub today
GitHub is home to over 40 million developers working together to host and review code, manage projects, and build software together.Sign up
CL 115975 split .text section into .text (code) and .rdata (read only data).
I expected .rdata not to need IMAGE_SCN_MEM_EXECUTE flag set (flag that instructs Windows to allow code execution in that section).
Unfortunately, when I run debug/pe tests, TestInternalLinkerDWARF failed with
I managed to fix test by adding IMAGE_SCN_MEM_EXECUTE to .rdata section. I did not have time to investigate why IMAGE_SCN_MEM_EXECUTE was required, so I just put TODO for later https://go-review.googlesource.com/c/go/+/115975/3/src/cmd/link/internal/ld/pe.go#1346
I had some time to debug this. TestInternalLinkerDWARF builds a.exe executable. I run a.exe in gdb. And I can see that the crash is happening in x_cgo_thread_start. All other functions do have debug information, but this function does not. The asm for x_cgo_thread_start is:
See how call into _beginthread says <runtime.etypes+24> ? It appears _beginthread function end-up in .rdata section.
It is no surprise that this code cannot execute - it needs IMAGE_SCN_MEM_EXECUTE.
How is _beginthread code
end-up in .rdata section? How can we make it go into .text section?
I am hoping that @ianlancetaylor has some ideas about this. :-)