]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/link: link against libsynchronization.a for -race on windows
authorThan McIntosh <thanm@google.com>
Fri, 24 Jun 2022 19:31:35 +0000 (15:31 -0400)
committerThan McIntosh <thanm@google.com>
Mon, 27 Jun 2022 16:28:25 +0000 (16:28 +0000)
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>

src/cmd/link/internal/ld/lib.go

index a3d8202e2cf18ae1c26598db44eca6c42c1f58ff..565ff9d6349b83dd9371f56c656720f1d7f17a65 100644 (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")