diff --git a/main.go b/main.go index 3e739ca..2c403f3 100644 --- a/main.go +++ b/main.go @@ -2325,6 +2325,16 @@ To install Go, see: https://go.dev/doc/install if err := json.Unmarshal(out, &sharedCache.GoEnv); err != nil { return fmt.Errorf(`cannot unmarshal from "go env -json": %w`, err) } + + // Some Go version managers switch between Go versions via a GOROOT which symlinks + // to one of the available versions. Given that later we build a patched linker + // from GOROOT/src via `go build -overlay`, we need to resolve any symlinks. + // Note that this edge case has no tests as it's relatively rare. + sharedCache.GoEnv.GOROOT, err = filepath.EvalSymlinks(sharedCache.GoEnv.GOROOT) + if err != nil { + return err + } + sharedCache.GoCmd = filepath.Join(sharedCache.GoEnv.GOROOT, "bin", "go") sharedCache.GOGARBLE = cmp.Or(os.Getenv("GOGARBLE"), "*") // we default to obfuscating everything return nil diff --git a/testdata/script/gotoolchain.txtar b/testdata/script/gotoolchain.txtar index 29c16af..ee8cea1 100644 --- a/testdata/script/gotoolchain.txtar +++ b/testdata/script/gotoolchain.txtar @@ -4,7 +4,6 @@ # setting up a `go` directive with its Go version. cd mod go mod init test -exec cat go.mod cd .. go env GOVERSION setenvfile GOVERSION_UPGRADE stdout