]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/link: suppress PIE whenever externally linking with a sanitizer
authorMichael Hudson-Doyle <michael.hudson@canonical.com>
Tue, 31 May 2016 07:24:30 +0000 (19:24 +1200)
committerMichael Hudson-Doyle <michael.hudson@canonical.com>
Tue, 31 May 2016 20:57:57 +0000 (20:57 +0000)
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>
src/cmd/link/internal/ld/lib.go

index ded5ac6de086e69b09d3f113273876d7ed1e63df..14f4fa9aad13bacdd1a5700815f91de3eeda2552 100644 (file)
@@ -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)