From: Ian Lance Taylor Date: Fri, 11 Nov 2016 06:08:51 +0000 (-0800) Subject: cmd/link: for -buildmode=exe pass -no-pie to external linker X-Git-Tag: go1.8beta1~212 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=53aec79ce05cd5eff1c8f5576b553d3c429227c3;p=gostls13.git 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 TryBot-Result: Gobot Gobot Reviewed-by: David Crawshaw --- 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)