1
0
mirror of https://github.com/golang/go synced 2024-09-28 22:14:28 -06:00

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:

41cb504b7c/compiler-rt/lib/sanitizer_common/sanitizer_win.cpp (L48)
41cb504b7c/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>
This commit is contained in:
Than McIntosh 2022-06-24 15:31:35 -04:00
parent f093cf90bf
commit c3bea70d9b

View File

@ -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")