]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.15] cmd/link: pass arch-specific flags to external linker when...
authorCherry Zhang <cherryyz@google.com>
Tue, 15 Dec 2020 23:31:21 +0000 (18:31 -0500)
committerCarlos Amedee <carlos@golang.org>
Thu, 10 Jun 2021 20:01:45 +0000 (20:01 +0000)
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 <cherryyz@google.com>
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Than McIntosh <thanm@google.com>
(cherry picked from commit a318d56c1e6e89996a3852a780f45c792d860d64)
Reviewed-on: https://go-review.googlesource.com/c/go/+/326711
Run-TryBot: Carlos Amedee <carlos@golang.org>
Reviewed-by: Dmitri Shuralyov <dmitshur@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Trust: Dmitri Shuralyov <dmitshur@golang.org>

src/cmd/link/internal/ld/lib.go

index d03fb6cf91b9260d2e811598dbaa214805c6fb62..5fb1776e8c6180af69c1a98cd324bfc8b0dc8afc 100644 (file)
@@ -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)