On Windows we default to PIE, except in race mode.
Pass isRace to platform.DefaultPIE to centralize that decision.
This is in preparation for adding another call to DefaultPIE.
Change-Id: I91b75d307e7d4d260246a934f98734ddcbca372a
Reviewed-on: https://go-review.googlesource.com/c/go/+/477916
TryBot-Result: Gopher Robot <gobot@golang.org>
Auto-Submit: Ian Lance Taylor <iant@google.com>
Reviewed-by: Bryan Mills <bcmills@google.com>
Reviewed-by: Ian Lance Taylor <iant@google.com>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
ldBuildmode = "c-shared"
case "default":
ldBuildmode = "exe"
- if platform.DefaultPIE(cfg.Goos, cfg.Goarch) {
- if cfg.Goos == "windows" && cfg.BuildRace {
- // PIE is not supported with -race on windows; see https://go.dev/cl/416174.
- } else {
- ldBuildmode = "pie"
- if cfg.Goos != "windows" && !gccgo {
- codegenArg = "-shared"
- }
+ if platform.DefaultPIE(cfg.Goos, cfg.Goarch, cfg.BuildRace) {
+ ldBuildmode = "pie"
+ if cfg.Goos != "windows" && !gccgo {
+ codegenArg = "-shared"
}
}
case "exe":
t.Fatalf("*main.X DIE had no runtime type attr. DIE: %v", dies[0])
}
- if platform.DefaultPIE(runtime.GOOS, runtime.GOARCH) {
+ if platform.DefaultPIE(runtime.GOOS, runtime.GOARCH, false) {
return // everything is PIE, addresses are relocated
}
if rtAttr.(uint64)+types.Addr != addr {
return true
}
}
- if platform.DefaultPIE(runtime.GOOS, runtime.GOARCH) {
+ if platform.DefaultPIE(runtime.GOOS, runtime.GOARCH, false) {
// Code is always relocated if the default buildmode is PIE.
return true
}
}
// DefaultPIE reports whether goos/goarch produces a PIE binary when using the
-// "default" buildmode.
-func DefaultPIE(goos, goarch string) bool {
+// "default" buildmode. On Windows this is affected by -race,
+// so force the caller to pass that in to centralize that choice.
+func DefaultPIE(goos, goarch string, isRace bool) bool {
switch goos {
case "android", "ios":
return true
case "windows":
- return true // but switches back to "exe" if -race is enabled
+ if isRace {
+ // PIE is not supported with -race on windows;
+ // see https://go.dev/cl/416174.
+ return false
+ }
+ return true
case "darwin":
return goarch == "arm64"
}