diff options
author | Ian Lance Taylor <iant@golang.org> | 2017-07-18 13:22:39 -0700 |
---|---|---|
committer | Ian Lance Taylor <iant@golang.org> | 2017-07-20 18:44:07 +0000 |
commit | a3310f9981ac6916a1c03ec9ac84ee023cb7d8ed (patch) | |
tree | 25ed0d87495792ef4527c079cfb19141911835b2 | |
parent | d6bb5454a7855fb87e84117b1bc95b0a71d35cab (diff) | |
download | go-a3310f9981ac6916a1c03ec9ac84ee023cb7d8ed.tar.gz go-a3310f9981ac6916a1c03ec9ac84ee023cb7d8ed.zip |
[release-branch.go1.4] cmd/go: if -no-pie doesn't work, try -nopie
This is a backport of https://golang.org/cl/49710 to the Go 1.4 branch.
Original CL description:
GCC says -no-pie, clang says -nopie.
Updates #21042
Change-Id: I67b755ccb0149324098b79e07ee4bbc49429c44c
Reviewed-on: https://go-review.googlesource.com/49711
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
-rw-r--r-- | src/cmd/go/build.go | 44 |
1 files changed, 25 insertions, 19 deletions
diff --git a/src/cmd/go/build.go b/src/cmd/go/build.go index 93bc2200f1a..13676589537 100644 --- a/src/cmd/go/build.go +++ b/src/cmd/go/build.go @@ -2121,34 +2121,40 @@ func (b *builder) ccompilerCmd(envvar, defcmd, objdir string) []string { return a } -// On systems with PIE (position independent executables) enabled by default, -// -no-pie must be passed when doing a partial link with -Wl,-r. But -no-pie is -// not supported by all compilers. -func (b *builder) gccSupportsNoPie() bool { +// gccNoPie returns the flag to use to request non-PIE. On systems +// with PIE (position independent executables) enabled by default, +// -no-pie must be passed when doing a partial link with -Wl,-r. +// But -no-pie is not supported by all compilers, and clang spells it -nopie. +func (b *builder) gccNoPie() string { if goos != "linux" { // On some BSD platforms, error messages from the // compiler make it to the console despite cmd.Std* // all being nil. As -no-pie is only required on linux // systems so far, we only test there. - return false + return "" } src := filepath.Join(b.work, "trivial.c") if err := ioutil.WriteFile(src, []byte{}, 0666); err != nil { - return false + return "" } - cmdArgs := b.gccCmd(b.work) - cmdArgs = append(cmdArgs, "-no-pie", "-c", "trivial.c") - if buildN || buildX { - b.showcmd(b.work, "%s", joinUnambiguously(cmdArgs)) - if buildN { - return false + for _, nopie := range []string{"-no-pie", "-nopie"} { + cmdArgs := b.gccCmd(b.work) + cmdArgs = append(cmdArgs, nopie, "-c", "trivial.c") + if buildN || buildX { + b.showcmd(b.work, "%s", joinUnambiguously(cmdArgs)) + if buildN { + return "" + } + } + cmd := exec.Command(cmdArgs[0], cmdArgs[1:]...) + cmd.Dir = b.work + cmd.Env = envForDir(cmd.Dir) + err := cmd.Run() + if err == nil { + return nopie } } - cmd := exec.Command(cmdArgs[0], cmdArgs[1:]...) - cmd.Dir = b.work - cmd.Env = envForDir(cmd.Dir) - err := cmd.Run() - return err == nil + return "" } // gccArchArgs returns arguments to pass to gcc based on the architecture. @@ -2399,8 +2405,8 @@ func (b *builder) cgo(p *Package, cgoExe, obj string, pcCFLAGS, pcLDFLAGS, gccfi } ldflags := stringList(bareLDFLAGS, "-Wl,-r", "-nostdlib", staticLibs) - if b.gccSupportsNoPie() { - ldflags = append(ldflags, "-no-pie") + if flag := b.gccNoPie(); flag != "" { + ldflags = append(ldflags, flag) } // Some systems, such as Ubuntu, always add --build-id to |