]> git.feebdaed.xyz Git - 0xmirror/go.git/commitdiff
runtime: on AIX check isarchive before calling libpreinit
authorIan Lance Taylor <iant@golang.org>
Sun, 7 Dec 2025 06:00:20 +0000 (22:00 -0800)
committerDavid Chase <drchase@google.com>
Tue, 9 Dec 2025 17:33:40 +0000 (09:33 -0800)
On AIX, all externally linked programs call _rt0_ppc64_aix_lib,
as seen in runtime/cgo/gcc_aix_ppc64.c. The idea is that we
only do the library initialization is isarchive is set.
However, before this CL, AIX programs would call libpreinit
before checking isarchive. The effect was that signals were
initialized twice. That caused the signal code to record that
all signals had an existing forwarding address, namely the
Go signal handler that was always installed. This caused signal
forwarding to enter an infinite loop. This caused, for example,
"go test os" to hang forever when running TestStdPipe.

Fixes #76081

Change-Id: I5555f8c5e299d45549f5ce601568dc6b3cff4ecc
Reviewed-on: https://go-review.googlesource.com/c/go/+/727820
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Keith Randall <khr@golang.org>
Reviewed-by: David Chase <drchase@google.com>
Reviewed-by: Keith Randall <khr@google.com>
src/runtime/asm_ppc64x.s

index aaa2e4346c7a411b7d8ac38ca019722b6e4cd747..ffc4b005cb0b328b7023e82e7ba9ccd390804179 100644 (file)
@@ -30,9 +30,6 @@ TEXT _rt0_ppc64x_lib(SB),NOSPLIT|NOFRAME,$0
        MOVD    $runtime·reginit(SB), R12
        MOVD    R12, CTR
        BL      (CTR)
-       MOVD    $runtime·libpreinit(SB), R12
-       MOVD    R12, CTR
-       BL      (CTR)
 
 #ifdef GOOS_aix
        // See runtime/cgo/gcc_aix_ppc64.c
@@ -41,6 +38,10 @@ TEXT _rt0_ppc64x_lib(SB),NOSPLIT|NOFRAME,$0
        BEQ             done
 #endif
 
+       MOVD    $runtime·libpreinit(SB), R12
+       MOVD    R12, CTR
+       BL      (CTR)
+
        // Create a new thread to do the runtime initialization and return.
        // _cgo_sys_thread_create is a C function.
        MOVD    _cgo_sys_thread_create(SB), R12