mirror of
https://github.com/golang/go
synced 2024-11-24 01:00:15 -07:00
cmd/go/internal/work: make toolchain builds reproducible when buildmode=pie
When buildmode=pie, external linking is forced, and our toolchain build id will be included in the external build id, resulting in the building of a toolchain tool will never reach a fixed point id. More importantly, this change will make make.bash converge on self-hosted Android builds (Android refuses to run non-PIE executables). Fixes #31320 Updates #18968 Change-Id: Icb5db9f4b1b688afe37f4dafe261ffda580fa4e7 Reviewed-on: https://go-review.googlesource.com/c/go/+/170942 Run-TryBot: Elias Naur <mail@eliasnaur.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
This commit is contained in:
parent
f18c31a49c
commit
e4665da9bc
@ -21,6 +21,7 @@ import (
|
||||
"cmd/go/internal/load"
|
||||
"cmd/go/internal/str"
|
||||
"cmd/internal/objabi"
|
||||
"cmd/internal/sys"
|
||||
"crypto/sha1"
|
||||
)
|
||||
|
||||
@ -525,7 +526,13 @@ func (gcToolchain) ld(b *Builder, root *Action, out, importcfg, mainpkg string)
|
||||
// Store BuildID inside toolchain binaries as a unique identifier of the
|
||||
// tool being run, for use by content-based staleness determination.
|
||||
if root.Package.Goroot && strings.HasPrefix(root.Package.ImportPath, "cmd/") {
|
||||
ldflags = append(ldflags, "-X=cmd/internal/objabi.buildID="+root.buildID)
|
||||
// When buildmode=pie, external linking will include our build
|
||||
// id in the external linker's build id, which will cause our
|
||||
// build id to not match the next time the tool is built.
|
||||
// Rely on the external build id instead.
|
||||
if ldBuildmode != "pie" || !sys.PIEDefaultsToExternalLink(cfg.Goos, cfg.Goarch) {
|
||||
ldflags = append(ldflags, "-X=cmd/internal/objabi.buildID="+root.buildID)
|
||||
}
|
||||
}
|
||||
|
||||
// If the user has not specified the -extld option, then specify the
|
||||
|
@ -27,3 +27,11 @@ func MSanSupported(goos, goarch string) bool {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
// PIEDefaultsToExternalLink reports whether goos/goarch defaults
|
||||
// to external linking for buildmode=pie.
|
||||
func PIEDefaultsToExternalLink(goos, goarch string) bool {
|
||||
// Currently all systems external link PIE binaries.
|
||||
// See https://golang.org/issue/18968.
|
||||
return true
|
||||
}
|
||||
|
@ -256,8 +256,8 @@ func determineLinkMode(ctxt *Link) {
|
||||
ctxt.LinkMode = LinkExternal
|
||||
} else if iscgo && externalobj {
|
||||
ctxt.LinkMode = LinkExternal
|
||||
} else if ctxt.BuildMode == BuildModePIE {
|
||||
ctxt.LinkMode = LinkExternal // https://golang.org/issue/18968
|
||||
} else if ctxt.BuildMode == BuildModePIE && sys.PIEDefaultsToExternalLink(objabi.GOOS, objabi.GOARCH) {
|
||||
ctxt.LinkMode = LinkExternal
|
||||
} else {
|
||||
ctxt.LinkMode = LinkInternal
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user