aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@golang.org>2016-11-10 22:08:51 -0800
committerIan Lance Taylor <iant@golang.org>2016-11-11 14:26:15 +0000
commit53aec79ce05cd5eff1c8f5576b553d3c429227c3 (patch)
treeba0a58175614b436669ff319d1cd53131661388a /src
parent0631f292d370cd838e1fb57e193c6c09e74fe9e4 (diff)
downloadgo-53aec79ce05cd5eff1c8f5576b553d3c429227c3.tar.xz
cmd/link: for -buildmode=exe pass -no-pie to external linker
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>
Diffstat (limited to 'src')
-rw-r--r--src/cmd/link/internal/ld/lib.go21
1 files changed, 8 insertions, 13 deletions
diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go
index 629facdc45..8c2d31c841 100644
--- a/src/cmd/link/internal/ld/lib.go
+++ b/src/cmd/link/internal/ld/lib.go
@@ -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)