aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Hudson-Doyle <michael.hudson@canonical.com>2016-05-31 19:24:30 +1200
committerMichael Hudson-Doyle <michael.hudson@canonical.com>2016-05-31 20:57:57 +0000
commit2c1791b13b27dfc69adf2d19ecf9a180d089cd22 (patch)
treed49cbac5ae99adb7471837af0dc9ea3cf68da430
parent2a6544b604b61898d666ffbe456ccde720c04577 (diff)
downloadgo-2c1791b13b27dfc69adf2d19ecf9a180d089cd22.tar.gz
go-2c1791b13b27dfc69adf2d19ecf9a180d089cd22.zip
cmd/link: suppress PIE whenever externally linking with a sanitizer
golang.org/issue/15443 complained that a race-enabled PIE binary crashed at startup, but other ways of linking in tsan (or other sanitizers) such as #cgo CFLAGS: -fsanitize=thread #cgo LDFLAGS: -fsanitize=thread have the same problem. Pass -no-pie to the host linker (if supported) if any -fsanitizer=foo cgo LDFLAG is seen when linking. Fixes #15887 Change-Id: Id799770f8d045f6f40fa8c463563937a5748d1a8 Reviewed-on: https://go-review.googlesource.com/23535 Run-TryBot: Michael Hudson-Doyle <michael.hudson@canonical.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
-rw-r--r--src/cmd/link/internal/ld/lib.go16
1 files changed, 12 insertions, 4 deletions
diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go
index ded5ac6de0..14f4fa9aad 100644
--- a/src/cmd/link/internal/ld/lib.go
+++ b/src/cmd/link/internal/ld/lib.go
@@ -1222,13 +1222,21 @@ func hostlink() {
}
}
+ sanitizers := flag_race != 0
+
+ for _, flag := range ldflag {
+ if strings.HasPrefix(flag, "-fsanitize=") {
+ sanitizers = true
+ }
+ }
+
argv = append(argv, ldflag...)
- if flag_race != 0 {
+ if sanitizers {
// On a system where the toolchain creates position independent
- // executables by default, tsan initialization can fail. So we pass
- // -no-pie here, but support for that flag is quite new and we test
- // for its support first.
+ // executables by default, tsan/msan/asan/etc initialization can
+ // fail. So we pass -no-pie here, but support for that flag is quite
+ // new and we test for its support first.
src := filepath.Join(tmpdir, "trivial.c")
if err := ioutil.WriteFile(src, []byte{}, 0666); err != nil {
Ctxt.Diag("WriteFile trivial.c failed: %v", err)