diff options
author | Cherry Mui <cherryyz@google.com> | 2021-12-16 14:33:13 -0500 |
---|---|---|
committer | Cherry Mui <cherryyz@google.com> | 2022-02-07 20:38:28 +0000 |
commit | 5ef95666946dd744c0392166981783f72687993f (patch) | |
tree | 5063be892fd59aefbe0b8194248e9c21df318ccd /src/cmd/link/internal/ld/lib.go | |
parent | 6b3e741a834c34b8a844a33b3aa060dd4ed37231 (diff) | |
download | go-5ef95666946dd744c0392166981783f72687993f.tar.gz go-5ef95666946dd744c0392166981783f72687993f.zip |
[release-branch.go1.16] cmd/link: force eager binding when using plugins on darwin
When building/using plugins on darwin, we need to use flat
namespace so the same symbol from the main executable and the
plugin can be resolved to the same address. Apparently, when using
flat namespace the dynamic linker can hang at forkExec when
resolving a lazy binding. Work around it by forcing early bindings.
Updates #38824.
Fixes #50245.
Change-Id: I983aa0a0960b15bf3f7871382e8231ee244655f4
Reviewed-on: https://go-review.googlesource.com/c/go/+/372798
Trust: Cherry Mui <cherryyz@google.com>
Reviewed-by: Than McIntosh <thanm@google.com>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Run-TryBot: Cherry Mui <cherryyz@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
(cherry picked from commit c5fee935bbb8f02406eb653cfed550593755a1a4)
Reviewed-on: https://go-review.googlesource.com/c/go/+/373095
Diffstat (limited to 'src/cmd/link/internal/ld/lib.go')
-rw-r--r-- | src/cmd/link/internal/ld/lib.go | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index 18db567041..d56a51e375 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -1269,7 +1269,10 @@ func (ctxt *Link) hostlink() { if ctxt.DynlinkingGo() && objabi.GOOS != "ios" { // -flat_namespace is deprecated on iOS. // It is useful for supporting plugins. We don't support plugins on iOS. - argv = append(argv, "-Wl,-flat_namespace") + // -flat_namespace may cause the dynamic linker to hang at forkExec when + // resolving a lazy binding. See issue 38824. + // Force eager resolution to work around. + argv = append(argv, "-Wl,-flat_namespace", "-Wl,-bind_at_load") } if !combineDwarf { argv = append(argv, "-Wl,-S") // suppress STAB (symbolic debugging) symbols |