]> Cypherpunks.ru repositories - gostls13.git/commitdiff
cmd/link/internal/ld: disable execute-only for external linking on openbsd/arm64
authorJoel Sing <joel@sing.id.au>
Thu, 13 Apr 2023 19:47:36 +0000 (05:47 +1000)
committerJoel Sing <joel@sing.id.au>
Fri, 14 Apr 2023 19:17:15 +0000 (19:17 +0000)
The Go arm64 assembler places constants into the text section of a binary.
OpenBSD 7.3 enabled xonly by default on OpenBSD/arm64. This means that any
externally linked Go binary now segfaults. Disable execute-only when invoking
the external linker on openbsd/arm64, in order to work around this issue.

Updates #59615

Change-Id: I1a291293da3c6e4409b21873d066ea15e9bfe280
Reviewed-on: https://go-review.googlesource.com/c/go/+/484555
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@google.com>
Reviewed-by: Aaron Bieber <deftly@gmail.com>
Run-TryBot: Joel Sing <joel@sing.id.au>
Reviewed-by: Than McIntosh <thanm@google.com>
src/cmd/link/internal/ld/lib.go

index b2a7daba23d599aba9127e27e888b5fa11bd5fa3..c88a955a0c5979487668bd737cf5155be4ac2832 100644 (file)
@@ -1407,6 +1407,12 @@ func (ctxt *Link) hostlink() {
        case objabi.Hopenbsd:
                argv = append(argv, "-Wl,-nopie")
                argv = append(argv, "-pthread")
+               if ctxt.Arch.InFamily(sys.ARM64) {
+                       // Disable execute-only on openbsd/arm64 - the Go arm64 assembler
+                       // currently stores constants in the text section rather than in rodata.
+                       // See issue #59615.
+                       argv = append(argv, "-Wl,--no-execute-only")
+               }
        case objabi.Hwindows:
                if windowsgui {
                        argv = append(argv, "-mwindows")