mirror of https://github.com/golang/go.git
cmd/go: use the correct linker config in the buildID hash
The linker config is hashed into the buildID; however,
the GOROOT_FINAL environment variable that is
actually used when -trimpath is specified was not
reflected in that hash. This change fixes that.
Fixes #38989
Change-Id: I418a21a9f6293ca63c101d22b501dfdba8e91ac6
GitHub-Last-Rev: 4cf82920e4
GitHub-Pull-Request: golang/go#40296
Reviewed-on: https://go-review.googlesource.com/c/go/+/243557
Run-TryBot: Jay Conrod <jayconrod@google.com>
Reviewed-by: Jay Conrod <jayconrod@google.com>
Trust: Jay Conrod <jayconrod@google.com>
Trust: Bryan C. Mills <bcmills@google.com>
This commit is contained in:
parent
5abba0c737
commit
0f7ac9b4f5
|
|
@ -1178,8 +1178,13 @@ func (b *Builder) printLinkerConfig(h io.Writer, p *load.Package) {
|
|||
key, val := cfg.GetArchEnv()
|
||||
fmt.Fprintf(h, "%s=%s\n", key, val)
|
||||
|
||||
// The linker writes source file paths that say GOROOT_FINAL.
|
||||
fmt.Fprintf(h, "GOROOT=%s\n", cfg.GOROOT_FINAL)
|
||||
// The linker writes source file paths that say GOROOT_FINAL, but
|
||||
// only if -trimpath is not specified (see ld() in gc.go).
|
||||
gorootFinal := cfg.GOROOT_FINAL
|
||||
if cfg.BuildTrimpath {
|
||||
gorootFinal = trimPathGoRootFinal
|
||||
}
|
||||
fmt.Fprintf(h, "GOROOT=%s\n", gorootFinal)
|
||||
|
||||
// GO_EXTLINK_ENABLED controls whether the external linker is used.
|
||||
fmt.Fprintf(h, "GO_EXTLINK_ENABLED=%s\n", cfg.Getenv("GO_EXTLINK_ENABLED"))
|
||||
|
|
|
|||
|
|
@ -25,6 +25,9 @@ import (
|
|||
"crypto/sha1"
|
||||
)
|
||||
|
||||
// The 'path' used for GOROOT_FINAL when -trimpath is specified
|
||||
const trimPathGoRootFinal = "go"
|
||||
|
||||
// The Go toolchain.
|
||||
|
||||
type gcToolchain struct{}
|
||||
|
|
@ -569,7 +572,7 @@ func (gcToolchain) ld(b *Builder, root *Action, out, importcfg, mainpkg string)
|
|||
|
||||
env := []string{}
|
||||
if cfg.BuildTrimpath {
|
||||
env = append(env, "GOROOT_FINAL=go")
|
||||
env = append(env, "GOROOT_FINAL="+trimPathGoRootFinal)
|
||||
}
|
||||
return b.run(root, dir, root.Package.ImportPath, env, cfg.BuildToolexec, base.Tool("link"), "-o", out, "-importcfg", importcfg, ldflags, mainpkg)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,38 @@
|
|||
# Checks that an identical binary is built with -trimpath from the same
|
||||
# source files, with GOROOT in two different locations.
|
||||
# Verifies golang.org/issue/38989
|
||||
|
||||
[short] skip
|
||||
[!symlink] skip
|
||||
|
||||
# Symlink the compiler to a local path
|
||||
env GOROOT=$WORK/goroot1
|
||||
symlink $GOROOT -> $TESTGO_GOROOT
|
||||
|
||||
# Set up fresh GOCACHE
|
||||
env GOCACHE=$WORK/gocache1
|
||||
mkdir $GOCACHE
|
||||
|
||||
# Build a simple binary
|
||||
go build -o binary1 -trimpath -x main.go
|
||||
|
||||
# Now repeat the same process with the compiler at a different local path
|
||||
env GOROOT=$WORK/goroot2
|
||||
symlink $GOROOT -> $TESTGO_GOROOT
|
||||
|
||||
env GOCACHE=$WORK/gocache2
|
||||
mkdir $GOCACHE
|
||||
|
||||
go build -o binary2 -trimpath -x main.go
|
||||
|
||||
# Check that the binaries match exactly
|
||||
go tool buildid binary1
|
||||
cp stdout buildid1
|
||||
go tool buildid binary2
|
||||
cp stdout buildid2
|
||||
cmp buildid1 buildid2
|
||||
|
||||
|
||||
-- main.go --
|
||||
package main
|
||||
func main() {}
|
||||
Loading…
Reference in New Issue