From: Ian Lance Taylor Date: Wed, 28 Apr 2021 04:56:46 +0000 (-0700) Subject: cmd/link: don't pass -Wl,--dynamic-linker if -static X-Git-Tag: go1.17beta1~397 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=24ea547a21;p=gostls13.git cmd/link: don't pass -Wl,--dynamic-linker if -static As with -rdynamic, clang will pass -Wl,--dynamic-linker to the linker even when linking statically. When using lld this will produce a statically linked executable with a dynamic interpreter, which will crash at runtime. This CL changes the linker to drop -Wl,--dynamic-linker when using -static, as it already does with -rdynamic. This has become more important since CL 310349, which changes the linker to always pass a -Wl,--dynamic-linker option if the Go linker is invoked with a -I option. Change-Id: I68ed431064f02c70018bc0547585e5b0ebd20a41 Reviewed-on: https://go-review.googlesource.com/c/go/+/314412 Trust: Ian Lance Taylor Reviewed-by: Cherry Zhang --- diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index 043bf5a35e..7408526076 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -1520,12 +1520,13 @@ func (ctxt *Link) hostlink() { // 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 + // only adding -rdynamic later, so that -extldflags // can override -rdynamic without using -static. + // Similarly for -Wl,--dynamic-linker. checkStatic := func(arg string) { if ctxt.IsELF && arg == "-static" { for i := range argv { - if argv[i] == "-rdynamic" { + if argv[i] == "-rdynamic" || strings.HasPrefix(argv[i], "-Wl,--dynamic-linker,") { argv[i] = "-static" } }