sanitizer: Use glibc _thread_db_sizeof_pthread symbol if present
I've cherry-picked following fix from llvm-project. Recent glibcs have _thread_db_sizeof_pthread symbol variable which contains the size of struct pthread, so that sanitizers don't need to guess that and risk that it will change again. 2022-02-15 Jakub Jelinek <jakub@redhat.com> * sanitizer_common/sanitizer_linux_libcdep.cpp: Cherry-pick llvm-project revision ef14b78d9a144ba81ba02083fe21eb286a88732b.
This commit is contained in:
parent
6a0d6e7ca9
commit
c4c0aa6089
1 changed files with 16 additions and 5 deletions
|
@ -220,10 +220,8 @@ void InitTlsSize() { }
|
|||
// sizeof(struct pthread) from glibc.
|
||||
static atomic_uintptr_t thread_descriptor_size;
|
||||
|
||||
uptr ThreadDescriptorSize() {
|
||||
uptr val = atomic_load_relaxed(&thread_descriptor_size);
|
||||
if (val)
|
||||
return val;
|
||||
static uptr ThreadDescriptorSizeFallback() {
|
||||
uptr val = 0;
|
||||
#if defined(__x86_64__) || defined(__i386__) || defined(__arm__)
|
||||
int major;
|
||||
int minor;
|
||||
|
@ -285,8 +283,21 @@ uptr ThreadDescriptorSize() {
|
|||
#elif defined(__powerpc64__)
|
||||
val = 1776; // from glibc.ppc64le 2.20-8.fc21
|
||||
#endif
|
||||
return val;
|
||||
}
|
||||
|
||||
uptr ThreadDescriptorSize() {
|
||||
uptr val = atomic_load_relaxed(&thread_descriptor_size);
|
||||
if (val)
|
||||
atomic_store_relaxed(&thread_descriptor_size, val);
|
||||
return val;
|
||||
// _thread_db_sizeof_pthread is a GLIBC_PRIVATE symbol that is exported in
|
||||
// glibc 2.34 and later.
|
||||
if (unsigned *psizeof = static_cast<unsigned *>(
|
||||
dlsym(RTLD_DEFAULT, "_thread_db_sizeof_pthread")))
|
||||
val = *psizeof;
|
||||
if (!val)
|
||||
val = ThreadDescriptorSizeFallback();
|
||||
atomic_store_relaxed(&thread_descriptor_size, val);
|
||||
return val;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue