aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorElias Naur <mail@eliasnaur.com>2019-04-07 15:02:31 +0200
committerElias Naur <mail@eliasnaur.com>2019-04-08 20:38:29 +0000
commite4665da9bcdd4e9136c7ed97ab4253def130b89d (patch)
tree6e602e130b40f4606f2bed7f3c7ee375e731f491 /src
parentf18c31a49c1105be0341b32392a433cf65f227da (diff)
downloadgo-e4665da9bcdd4e9136c7ed97ab4253def130b89d.tar.xz
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>
Diffstat (limited to 'src')
-rw-r--r--src/cmd/go/internal/work/gc.go9
-rw-r--r--src/cmd/internal/sys/supported.go8
-rw-r--r--src/cmd/link/internal/ld/config.go4
3 files changed, 18 insertions, 3 deletions
diff --git a/src/cmd/go/internal/work/gc.go b/src/cmd/go/internal/work/gc.go
index cdd0989a93..1721ecbc4e 100644
--- a/src/cmd/go/internal/work/gc.go
+++ b/src/cmd/go/internal/work/gc.go
@@ -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
diff --git a/src/cmd/internal/sys/supported.go b/src/cmd/internal/sys/supported.go
index a53da6ed2c..c963971f59 100644
--- a/src/cmd/internal/sys/supported.go
+++ b/src/cmd/internal/sys/supported.go
@@ -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
+}
diff --git a/src/cmd/link/internal/ld/config.go b/src/cmd/link/internal/ld/config.go
index 85842f2fa2..b404f1897d 100644
--- a/src/cmd/link/internal/ld/config.go
+++ b/src/cmd/link/internal/ld/config.go
@@ -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
}