From 2c1791b13b27dfc69adf2d19ecf9a180d089cd22 Mon Sep 17 00:00:00 2001 From: Michael Hudson-Doyle Date: Tue, 31 May 2016 19:24:30 +1200 Subject: [PATCH] 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 TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/cmd/link/internal/ld/lib.go | 16 ++++++++++++---- 1 file 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)