aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/link/internal/ld/lib.go
diff options
context:
space:
mode:
authorThan McIntosh <thanm@google.com>2022-06-24 15:31:35 -0400
committerThan McIntosh <thanm@google.com>2022-06-27 16:28:25 +0000
commitc3bea70d9b3b80ceb7733cd7bde0cdf0a1bfd0d0 (patch)
tree82f9e2b39c2b6f05e20a8143a8ad9540377dcdc9 /src/cmd/link/internal/ld/lib.go
parentf093cf90bff4bfc4e0a304283eef0d2445d67538 (diff)
downloadgo-c3bea70d9b3b80ceb7733cd7bde0cdf0a1bfd0d0.tar.xz
cmd/link: link against libsynchronization.a for -race on windows
As of LLVM rev 41cb504b7c4b18ac15830107431a0c1eec73a6b2, the race detector runtime now refers to things in the windows synchronization library, hence when doing windows internal linking, at that library to the list of host archives that we visit. The tsan code that makes the reference is here: https://github.com/llvm/llvm-project/blob/41cb504b7c4b18ac15830107431a0c1eec73a6b2/compiler-rt/lib/sanitizer_common/sanitizer_win.cpp#L48 https://github.com/llvm/llvm-project/blob/41cb504b7c4b18ac15830107431a0c1eec73a6b2/compiler-rt/lib/sanitizer_common/sanitizer_win.cpp#L834 Note that libsynchronization.a is not guaranteed to be available on all windows systems, so in the external linking case, check for its existence before adding "-lsynchronization" to the external linker args. Updates #53539. Change-Id: I433c95c869915693d59e9c1082d5b8a11da1fc8c Reviewed-on: https://go-review.googlesource.com/c/go/+/413817 Reviewed-by: Cherry Mui <cherryyz@google.com> Run-TryBot: Than McIntosh <thanm@google.com>
Diffstat (limited to 'src/cmd/link/internal/ld/lib.go')
-rw-r--r--src/cmd/link/internal/ld/lib.go10
1 files changed, 10 insertions, 0 deletions
diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go
index a3d8202e2c..565ff9d634 100644
--- a/src/cmd/link/internal/ld/lib.go
+++ b/src/cmd/link/internal/ld/lib.go
@@ -652,6 +652,11 @@ func loadWindowsHostArchives(ctxt *Link) {
hostObject(ctxt, "crt2", p)
}
}
+ if *flagRace {
+ if p := ctxt.findLibPath("libsynchronization.a"); p != "none" {
+ hostArchive(ctxt, p)
+ }
+ }
if p := ctxt.findLibPath("libmingwex.a"); p != "none" {
hostArchive(ctxt, p)
}
@@ -1705,6 +1710,11 @@ func (ctxt *Link) hostlink() {
p := writeGDBLinkerScript()
argv = append(argv, "-Wl,-T,"+p)
}
+ if *flagRace {
+ if p := ctxt.findLibPath("libsynchronization.a"); p != "libsynchronization.a" {
+ argv = append(argv, "-lsynchronization")
+ }
+ }
// libmingw32 and libmingwex have some inter-dependencies,
// so must use linker groups.
argv = append(argv, "-Wl,--start-group", "-lmingwex", "-lmingw32", "-Wl,--end-group")