From b4a2af26baa7e0eb28dd0fd88147f2c87604696e Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Tue, 15 Dec 2020 18:31:21 -0500 Subject: [release-branch.go1.15] cmd/link: pass arch-specific flags to external linker when testing supported flag When testing if a flag (e.g. "-no-pie") is supported by the external linker, pass arch-specific flags (like "-marm"). In particular, on the ARM builder, if CGO_LDFLAGS=-march=armv6 is set, the C toolchain fails to build if -marm is not passed. # cc -march=armv6 1.c 1.c: In function 'main': 1.c:3:1: sorry, unimplemented: Thumb-1 hard-float VFP ABI int main() { ^~~ This makes the Go linker think "-no-pie" is not supported when it actually is. Passing -marm makes it work. Fixes #46684. Change-Id: I4e8b71f08818993cbbcb2494b310c68d812d6b50 Reviewed-on: https://go-review.googlesource.com/c/go/+/278592 Trust: Cherry Zhang Run-TryBot: Cherry Zhang TryBot-Result: Go Bot Reviewed-by: Than McIntosh (cherry picked from commit a318d56c1e6e89996a3852a780f45c792d860d64) Reviewed-on: https://go-review.googlesource.com/c/go/+/326711 Run-TryBot: Carlos Amedee Reviewed-by: Dmitri Shuralyov Reviewed-by: Ian Lance Taylor Trust: Dmitri Shuralyov --- src/cmd/link/internal/ld/lib.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index d03fb6cf91b..5fb1776e8c6 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -1555,7 +1555,7 @@ func (ctxt *Link) hostlink() { } const compressDWARF = "-Wl,--compress-debug-sections=zlib-gnu" - if ctxt.compressDWARF && linkerFlagSupported(argv[0], altLinker, compressDWARF) { + if ctxt.compressDWARF && linkerFlagSupported(ctxt.Arch, argv[0], altLinker, compressDWARF) { argv = append(argv, compressDWARF) } @@ -1645,7 +1645,7 @@ func (ctxt *Link) hostlink() { if ctxt.BuildMode == BuildModeExe && !ctxt.linkShared { // GCC uses -no-pie, clang uses -nopie. for _, nopie := range []string{"-no-pie", "-nopie"} { - if linkerFlagSupported(argv[0], altLinker, nopie) { + if linkerFlagSupported(ctxt.Arch, argv[0], altLinker, nopie) { argv = append(argv, nopie) break } @@ -1746,7 +1746,7 @@ func (ctxt *Link) hostlink() { var createTrivialCOnce sync.Once -func linkerFlagSupported(linker, altLinker, flag string) bool { +func linkerFlagSupported(arch *sys.Arch, linker, altLinker, flag string) bool { createTrivialCOnce.Do(func() { src := filepath.Join(*flagTmpdir, "trivial.c") if err := ioutil.WriteFile(src, []byte("int main() { return 0; }"), 0666); err != nil { @@ -1780,7 +1780,7 @@ func linkerFlagSupported(linker, altLinker, flag string) bool { "-target", } - var flags []string + flags := hostlinkArchArgs(arch) keep := false skip := false extldflags := strings.Fields(*flagExtldflags) -- cgit v1.2.3-54-g00ecf