add("msan", sysCondition("-msan", platform.MSanSupported, true))
add("mustlinkext", script.Condition("platform always requires external linking", mustLinkExt))
add("net", script.PrefixCondition("can connect to external network host <suffix>", hasNet))
+ add("pielinkext", script.Condition("platform requires external linking for PIE", pieLinkExt))
add("race", sysCondition("-race", platform.RaceDetectorSupported, true))
add("symlink", lazyBool("testenv.HasSymlink()", testenv.HasSymlink))
add("trimpath", script.OnceCondition("test binary was built with -trimpath", isTrimpath))
GOARCH, _ := s.LookupEnv("GOARCH")
return platform.MustLinkExternal(GOOS, GOARCH, false), nil
}
+
+func pieLinkExt(s *script.State) (bool, error) {
+ GOOS, _ := s.LookupEnv("GOOS")
+ GOARCH, _ := s.LookupEnv("GOARCH")
+ return !platform.InternalLinkPIESupported(GOOS, GOARCH), nil
+}
stdout '^\tpath\tcmd/test2json$'
! stdout 'mod[^e]'
-# Repeat the test with -buildmode=pie.
+# Repeat the test with -buildmode=pie and default linking.
[!buildmode:pie] stop
+[pielinkext] [!cgo] stop
go build -buildmode=pie -o external.exe rsc.io/fortune
go version external.exe
stdout '^external.exe: .+'
stdout '^\tmod\trsc.io/fortune\tv1.0.0'
# Also test PIE with internal linking.
-# currently only supported on linux/amd64, linux/arm64 and windows/amd64.
-[!GOOS:linux] [!GOOS:windows] stop
-[!GOARCH:amd64] [!GOARCH:arm64] stop
+[pielinkext] stop
go build -buildmode=pie -ldflags=-linkmode=internal -o internal.exe rsc.io/fortune
go version internal.exe
stdout '^internal.exe: .+'