diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_linux_libcdep.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_linux_libcdep.cpp --- a/compiler-rt/lib/sanitizer_common/sanitizer_linux_libcdep.cpp +++ b/compiler-rt/lib/sanitizer_common/sanitizer_linux_libcdep.cpp @@ -416,6 +416,16 @@ align = Max(align, 16); #else align = Max(align, 64); + // Work around a broken glibc on Ubuntu 16.04 amd64. + if (*addr == 0 && sizeof(void *) == 8) { + void *ptr = dlsym(RTLD_NEXT, "_dl_get_tls_static_info"); + size_t tls_align; + uptr addr2; + ((void (*)(uptr *, size_t *))ptr)(size, &tls_align); + asm("mov %%fs:0,%0" : "=r"(addr2)); + *addr = addr2 + ThreadDescriptorSize() - *size; + return; + } #endif } const uptr tp = RoundUpTo(*addr + *size, align);