From 9eaebe0ad223d495623aad3981987d6e7d7ca237 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Motiejus=20Jak=C5=A1tys?= Date: Wed, 30 Nov 2022 21:10:04 +0200 Subject: [PATCH] rules_go: cherry-pick a gorace workaround --- WORKSPACE | 4 +++ patches/BUILD | 1 + patches/rulesgo-race-extld.patch | 54 ++++++++++++++++++++++++++++++++ test/gorace/BUILD | 1 - 4 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 patches/BUILD create mode 100644 patches/rulesgo-race-extld.patch diff --git a/WORKSPACE b/WORKSPACE index 2aea72f..d3ce993 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -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", diff --git a/patches/BUILD b/patches/BUILD new file mode 100644 index 0000000..d518110 --- /dev/null +++ b/patches/BUILD @@ -0,0 +1 @@ +exports_files(glob(["*.patch"])) diff --git a/patches/rulesgo-race-extld.patch b/patches/rulesgo-race-extld.patch new file mode 100644 index 0000000..f07c0b1 --- /dev/null +++ b/patches/rulesgo-race-extld.patch @@ -0,0 +1,54 @@ +From 4c15193a7f1a94895a5e0af0f0a15879af040ce2 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Motiejus=20Jak=C5=A1tys?= +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 + diff --git a/test/gorace/BUILD b/test/gorace/BUILD index 0051495..c12112a 100644 --- a/test/gorace/BUILD +++ b/test/gorace/BUILD @@ -20,6 +20,5 @@ go_test( name = "gorace_test", srcs = ["main_test.go"], embed = [":gorace_lib"], - gc_linkopts = ["-linkmode=external"], race = "on", )