From: Ian Lance Taylor Date: Tue, 3 Jul 2018 17:16:03 +0000 (-0700) Subject: cmd/link: remove -rdynamic if -static appears in cgo LDFLAGS X-Git-Tag: go1.11beta2~214 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=ad4e6370fe801c7d7b97e893b87c7f3d5b05f955;p=gostls13.git cmd/link: remove -rdynamic if -static appears in cgo LDFLAGS 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 TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index d3abb7a6cb..220aab310f 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -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