From ff65758dd92db4aa98bb126625fd8358d8498149 Mon Sep 17 00:00:00 2001 From: Jeremy Quirke Date: Sun, 19 Nov 2023 15:39:21 -0800 Subject: [PATCH] Fix breaking change with assembler in go1.22 In go1.22, a breaking change to the build system is introduced. https://go-review.googlesource.com/c/go/+/523337 Namely, that the packagename now *must* passed to the assembler, even when generating only the symabis. The go build system has always done this, but Bazel Go rules have not, and this finally breaks in go1.22. Without specifying -p to the assembler, the output symabis file will contain something like: ``` def .s2Decode ABI0 ``` instead of ``` def github.com/klauspost/compress/s2.s2Decode ABI0 ``` The result is that the compiler will default to using ABIInternal instead of ABI0 if it cannot resolve a match in symabis, which will cause a link failure: ``` Use --sandbox_debug to see verbose messages from the sandbox and retain the sandbox build root for debugging github.com/klauspost/compress/s2.Decode: relocation target github.com/klauspost/compress/s2.s2Decode not defined for ABIInternal (but is defined for ABI0) link: error running subcommand external/go_sdk/pkg/tool/darwin_arm64/link: exit status 2 ``` We conservatively only do this for go minor releases later than 1.21. --- go/tools/builders/asm.go | 9 ++++++++- go/tools/builders/compilepkg.go | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/go/tools/builders/asm.go b/go/tools/builders/asm.go index 3d64c9ba37..6704be70f6 100644 --- a/go/tools/builders/asm.go +++ b/go/tools/builders/asm.go @@ -35,7 +35,7 @@ var ASM_DEFINES = []string{ // by the compiler. This is only needed in go1.12+ when there is at least one // .s file. If the symabis file is not needed, no file will be generated, // and "", nil will be returned. -func buildSymabisFile(goenv *env, sFiles, hFiles []fileInfo, asmhdr string) (string, error) { +func buildSymabisFile(goenv *env, packagePath string, sFiles, hFiles []fileInfo, asmhdr string) (string, error) { if len(sFiles) == 0 { return "", nil } @@ -94,6 +94,13 @@ func buildSymabisFile(goenv *env, sFiles, hFiles []fileInfo, asmhdr string) (str seenHdrDirs[hdrDir] = true } } + // The package path has to be specified as of Go 1.22 or the resulting + // object will be unlinkable, but the -p flag is only required in + // preparing symabis since Go1.22, however, go build has been + // emitting -p for both symabi and actual assembly since at least Go1.19 + if packagePath != "" && isGo119OrHigher() { + asmargs = append(asmargs, "-p", packagePath) + } asmargs = append(asmargs, ASM_DEFINES...) asmargs = append(asmargs, "-gensymabis", "-o", symabisName, "--") for _, sFile := range sFiles { diff --git a/go/tools/builders/compilepkg.go b/go/tools/builders/compilepkg.go index b3a6d283a9..b0cb0dbfa0 100644 --- a/go/tools/builders/compilepkg.go +++ b/go/tools/builders/compilepkg.go @@ -471,7 +471,7 @@ func compileArchive( } var symabisPath string if !haveCgo { - symabisPath, err = buildSymabisFile(goenv, srcs.sSrcs, srcs.hSrcs, asmHdrPath) + symabisPath, err = buildSymabisFile(goenv, packagePath, srcs.sSrcs, srcs.hSrcs, asmHdrPath) if symabisPath != "" { if !goenv.shouldPreserveWorkDir { defer os.Remove(symabisPath)