1
Fork 0

rules_go: cherry-pick a gorace workaround

nix
Motiejus Jakštys 2022-11-30 21:10:04 +02:00
parent bf88ddb2d5
commit 9eaebe0ad2
4 changed files with 59 additions and 1 deletions

View File

@ -6,6 +6,10 @@ load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
name = "io_bazel_rules_go",
patch_args = ["-p1"],
patches = [
"//patches:rulesgo-race-extld.patch", # https://github.com/bazelbuild/rules_go/pull/3370
],
sha256 = "16e9fca53ed6bd4ff4ad76facc9b7b651a89db1689a2877d6fd7b82aa824e366",
urls = [
"https://mirror.bazel.build/github.com/bazelbuild/rules_go/releases/download/v0.34.0/rules_go-v0.34.0.zip",

1
patches/BUILD Normal file
View File

@ -0,0 +1 @@
exports_files(glob(["*.patch"]))

View File

@ -0,0 +1,54 @@
From 4c15193a7f1a94895a5e0af0f0a15879af040ce2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Motiejus=20Jak=C5=A1tys?= <motiejus@uber.com>
Date: Wed, 30 Nov 2022 10:38:18 +0200
Subject: [PATCH] go link: use external linker when in race mode
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.
---
go/private/actions/link.bzl | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/go/private/actions/link.bzl b/go/private/actions/link.bzl
index 7f059e2d..ddc9cd0e 100644
--- a/go/private/actions/link.bzl
+++ b/go/private/actions/link.bzl
@@ -80,12 +80,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:
@@ -97,6 +99,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,
--
2.34.1

View File

@ -20,6 +20,5 @@ go_test(
name = "gorace_test",
srcs = ["main_test.go"],
embed = [":gorace_lib"],
gc_linkopts = ["-linkmode=external"],
race = "on",
)