]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/link: for -buildmode=exe pass -no-pie to external linker
authorIan Lance Taylor <iant@golang.org>
Fri, 11 Nov 2016 06:08:51 +0000 (22:08 -0800)
committerIan Lance Taylor <iant@golang.org>
Fri, 11 Nov 2016 14:26:15 +0000 (14:26 +0000)
On some systems the external linker defaults to PIE. On some systems
DT_TEXTREL does not work correctly. When both are true we have a bad
situation: any Go program built with the default buildmode (exe) that
uses external linking will fail to run. Fix this by passing -no-pie to
the external linker, if the option is supported.

Fixes #17847.

Change-Id: I9b5ff97825d8b7f494f96d29c4c04f72b53dbf4e
Reviewed-on: https://go-review.googlesource.com/33106
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: David Crawshaw <crawshaw@golang.org>
src/cmd/link/internal/ld/lib.go

index 629facdc45d4adba3d501663d98c243b1147e0e1..8c2d31c84126c67f25c988f5b1dbe96201a20e4a 100644 (file)
@@ -1134,21 +1134,16 @@ func (l *Link) hostlink() {
                }
        }
 
-       sanitizers := *flagRace
-
-       for _, flag := range ldflag {
-               if strings.HasPrefix(flag, "-fsanitize=") {
-                       sanitizers = true
-               }
-       }
-
        argv = append(argv, ldflag...)
 
-       if sanitizers {
-               // On a system where the toolchain creates position independent
-               // 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.
+       // When building a program with the default -buildmode=exe the
+       // gc compiler generates code requires DT_TEXTREL in a
+       // position independent executable (PIE). On systems where the
+       // toolchain creates PIEs by default, and where DT_TEXTREL
+       // does not work, the resulting programs will not run. See
+       // issue #17847. To avoid this problem pass -no-pie to the
+       // toolchain if it is supported.
+       if Buildmode == BuildmodeExe {
                src := filepath.Join(*flagTmpdir, "trivial.c")
                if err := ioutil.WriteFile(src, []byte{}, 0666); err != nil {
                        Errorf(nil, "WriteFile trivial.c failed: %v", err)