Commit e4665da9 authored by Elias Naur's avatar Elias Naur

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: default avatarIan Lance Taylor <iant@golang.org>
parent f18c31a4
......@@ -21,6 +21,7 @@ import (
"cmd/go/internal/load"
"cmd/go/internal/str"
"cmd/internal/objabi"
"cmd/internal/sys"
"crypto/sha1"
)
......@@ -525,8 +526,14 @@ 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/") {
// 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
// appropriate linker. In case of C++ code, use the compiler named
......
......@@ -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
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment