Skip to content

Commit

Permalink
go link: use external linker when in race mode (bazelbuild#3370)
Browse files Browse the repository at this point in the history
As of clang 15.0.3 (via zig v0.10), when building with `race = "on"` on
x86_64 Linux, we observe the following:

    runtime/cgo(.text): relocation target memset not defined

From my past experience, reporting a Go linker error when the external
linker works has a high chance to get the ticket closed as unactionable;
so it makes sense to just use an external linker, when it works.

Also, do not set the flag if external cpp toolchain is not set up.
  • Loading branch information
motiejus authored and jacqueline.lee committed Jul 19, 2023
1 parent 8de6dd4 commit f075d3e
Showing 1 changed file with 8 additions and 1 deletion.
9 changes: 8 additions & 1 deletion go/private/actions/link.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -89,12 +89,14 @@ def emit_link(
tool_args = go.tool_args(go)

# Add in any mode specific behaviours
tool_args.add_all(extld_from_cc_toolchain(go))
extld = extld_from_cc_toolchain(go)
tool_args.add_all(extld)
if go.mode.race:
tool_args.add("-race")
if go.mode.msan:
tool_args.add("-msan")
if ((go.mode.static and not go.mode.pure) or
(go.mode.race and extld) or
go.mode.link != LINKMODE_NORMAL or
go.mode.goos == "windows" and (go.mode.race or go.mode.msan)):
# Force external linking for the following conditions:
Expand All @@ -106,6 +108,11 @@ def emit_link(
# incompatibilities with mingw, and we get link errors in race mode.
# Using the C linker avoids that. Race and msan always require a
# a C toolchain. See #2614.
# * Linux race builds: we get linker errors during build with Go's
# internal linker. For example, when using zig cc v0.10
# (clang-15.0.3):
#
# runtime/cgo(.text): relocation target memset not defined
tool_args.add("-linkmode", "external")
if go.mode.pure:
# Force internal linking in pure mode. We don't have a C toolchain,
Expand Down

0 comments on commit f075d3e

Please sign in to comment.