1
0
mirror of https://github.com/golang/go synced 2024-11-19 13:34:45 -07:00

runtime: ignore sigaction error on Linux if it is for SIGRTMAX

The Go runtime registers a handler for every signal. This prevents Go
binaries from working on QEMU in user-emulation mode, since the hacky
way QEMU implements signals on Linux assumes that no-one uses signal
64 (SIGRTMAX).

In the past, we had a workaround in the runtime to prevent crashes on
start-up when running on QEMU:

  golang.org/cl/124900043
  golang.org/cl/16853

but it went lost during the 1.11 dev cycle. More precisely, the test
for SIGRTMAX was dropped in CL 18150 when we stopped testing the
result of sigaction in the Linux implementation of setsig. That change
was made to avoid a stack split overflow because code started calling
setsig from nosplit functions. Then in CL 99077 we started testing the
result of sigaction again, this time using systemstack to avoid to
stack split overflow. When this test was added back, we did not bring
back the test of SIGRTMAX.

As a result, Go1.10 binaries work on QEMU, while 1.11 binaries
immediately crash on startup.

This change restores the QEMU workaround.

Updates #24656

Change-Id: I46380b1e1b4bf47db7bc7b3d313f00c4e4c11ea3
Reviewed-on: https://go-review.googlesource.com/111176
Reviewed-by: Ian Lance Taylor <iant@golang.org>
This commit is contained in:
Alberto Donizetti 2018-05-03 10:13:31 +02:00
parent eed79f46c2
commit 2aef675000

View File

@ -415,12 +415,16 @@ func (c *sigctxt) fixsigcode(sig uint32) {
//go:nosplit //go:nosplit
func sysSigaction(sig uint32, new, old *sigactiont) { func sysSigaction(sig uint32, new, old *sigactiont) {
if rt_sigaction(uintptr(sig), new, old, unsafe.Sizeof(sigactiont{}.sa_mask)) != 0 { if rt_sigaction(uintptr(sig), new, old, unsafe.Sizeof(sigactiont{}.sa_mask)) != 0 {
// Workaround for bug in Qemu user mode emulation. (qemu
// rejects rt_sigaction of signal 64, SIGRTMAX).
if sig != 64 {
// Use system stack to avoid split stack overflow on ppc64/ppc64le. // Use system stack to avoid split stack overflow on ppc64/ppc64le.
systemstack(func() { systemstack(func() {
throw("sigaction failed") throw("sigaction failed")
}) })
} }
} }
}
// rt_sigaction is implemented in assembly. // rt_sigaction is implemented in assembly.
//go:noescape //go:noescape