]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/link: remove -rdynamic if -static appears in cgo LDFLAGS
authorIan Lance Taylor <iant@golang.org>
Tue, 3 Jul 2018 17:16:03 +0000 (10:16 -0700)
committerIan Lance Taylor <iant@golang.org>
Wed, 4 Jul 2018 00:15:55 +0000 (00:15 +0000)
We already remove -rdynamic if -static appears in -extldflags.
Extend that to apply to CGO_LDFLAGS and #cgo LDFLAGS as well.

Updates #26197

Change-Id: Ibb62d1b20726916a12fd889acb05c1c559a5ace2
Reviewed-on: https://go-review.googlesource.com/122135
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
src/cmd/link/internal/ld/lib.go

index d3abb7a6cba87919bd3c22d409f915bc0d096018..220aab310f06d8d615ca5df62863d79b52491621 100644 (file)
@@ -1262,7 +1262,26 @@ func (ctxt *Link) hostlink() {
                }
        }
 
-       argv = append(argv, ldflag...)
+       // clang, unlike GCC, passes -rdynamic to the linker
+       // even when linking with -static, causing a linker
+       // error when using GNU ld. So take out -rdynamic if
+       // we added it. We do it in this order, rather than
+       // only adding -rdynamic later, so that -*extldflags
+       // can override -rdynamic without using -static.
+       checkStatic := func(arg string) {
+               if ctxt.IsELF && arg == "-static" {
+                       for i := range argv {
+                               if argv[i] == "-rdynamic" {
+                                       argv[i] = "-static"
+                               }
+                       }
+               }
+       }
+
+       for _, p := range ldflag {
+               argv = append(argv, p)
+               checkStatic(p)
+       }
 
        // When building a program with the default -buildmode=exe the
        // gc compiler generates code requires DT_TEXTREL in a
@@ -1283,20 +1302,7 @@ func (ctxt *Link) hostlink() {
 
        for _, p := range strings.Fields(*flagExtldflags) {
                argv = append(argv, p)
-
-               // clang, unlike GCC, passes -rdynamic to the linker
-               // even when linking with -static, causing a linker
-               // error when using GNU ld. So take out -rdynamic if
-               // we added it. We do it in this order, rather than
-               // only adding -rdynamic later, so that -*extldflags
-               // can override -rdynamic without using -static.
-               if ctxt.IsELF && p == "-static" {
-                       for i := range argv {
-                               if argv[i] == "-rdynamic" {
-                                       argv[i] = "-static"
-                               }
-                       }
-               }
+               checkStatic(p)
        }
        if ctxt.HeadType == objabi.Hwindows {
                // use gcc linker script to work around gcc bug