Fix PR78294 - thread sanitizer broken when using ld.gold
authorMarkus Trippelsdorf <markus@trippelsdorf.de>
Wed, 16 Nov 2016 11:21:42 +0000 (11:21 +0000)
committerMarkus Trippelsdorf <trippels@gcc.gnu.org>
Wed, 16 Nov 2016 11:21:42 +0000 (11:21 +0000)
When one uses ld.gold to build gcc, the thread sanitizer doesn't work,
because gold is more conservative when applying TLS relaxations than
ld.bfd. In this case a missing initial-exec attribute on a declaration
causes gcc to assume the general dynamic model. With ld.bfd this gets
relaxed to initial exec when linking the shared library, so the missing
attribute doesn't matter. But ld.gold doesn't perform this optimization
and this leads to crashes on tsan instrumented binaries.

See: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78294
and: https://sourceware.org/bugzilla/show_bug.cgi?id=20805

The fix is easy, just add the missing attribute.

  PR sanitizer/78294
  * tsan/tsan_rtl.cc: Add missing attribute.

From-SVN: r242480

libsanitizer/ChangeLog
libsanitizer/tsan/tsan_rtl.cc

index e56cef9c8f437be8409e396bab45a2377b31e732..215c44465bc5866902095b774859592e69948f0e 100644 (file)
@@ -1,3 +1,8 @@
+2016-11-16  Markus Trippelsdorf  <markus@trippelsdorf.de>
+
+       PR sanitizer/78294
+       * tsan/tsan_rtl.cc: Add missing attribute.
+
 2016-11-16  Maxim Ostapenko  <m.ostapenko@samsung.com>
 
        * LOCAL_PATCHES: New file.
index 07fa165e939c198a4c84cf2e7fac4acb8f7fe82d..5be28ce5502e442e54b11a5fcd1b19e6ac30fcc5 100644 (file)
@@ -43,6 +43,7 @@ extern "C" void __tsan_resume() {
 namespace __tsan {
 
 #if !SANITIZER_GO && !SANITIZER_MAC
+  __attribute__((tls_model("initial-exec")))
 THREADLOCAL char cur_thread_placeholder[sizeof(ThreadState)] ALIGNED(64);
 #endif
 static char ctx_placeholder[sizeof(Context)] ALIGNED(64);