[LSan] Detect dynamic loader by its base address.
Summary: Whenever possible (Linux + glibc 2.16+), detect dynamic loader module by its base address, not by the module name matching. The current name matching approach fails on some configurations. Reviewers: eugenis Subscribers: kubamracek, llvm-commits Differential Revision: https://reviews.llvm.org/D33859 llvm-svn: 304633
This commit is contained in:
parent
edc20a10c1
commit
2090504453
|
@ -408,6 +408,9 @@ static void MarkInvalidPCCb(uptr chunk, void *arg) {
|
|||
|
||||
// On Linux, handles dynamically allocated TLS blocks by treating all chunks
|
||||
// allocated from ld-linux.so as reachable.
|
||||
// On Linux, treats all chunks allocated from ld-linux.so as reachable, which
|
||||
// covers dynamically allocated TLS blocks, internal dynamic loader's loaded
|
||||
// modules accounting etc.
|
||||
// Dynamic TLS blocks contain the TLS variables of dynamically loaded modules.
|
||||
// They are allocated with a __libc_memalign() call in allocate_and_init()
|
||||
// (elf/dl-tls.c). Glibc won't tell us the address ranges occupied by those
|
||||
|
|
|
@ -23,6 +23,10 @@
|
|||
#include "sanitizer_common/sanitizer_linux.h"
|
||||
#include "sanitizer_common/sanitizer_stackdepot.h"
|
||||
|
||||
#if SANITIZER_USE_GETAUXVAL
|
||||
#include <sys/auxv.h>
|
||||
#endif // SANITIZER_USE_GETAUXVAL
|
||||
|
||||
namespace __lsan {
|
||||
|
||||
static const char kLinkerName[] = "ld";
|
||||
|
@ -30,8 +34,12 @@ static const char kLinkerName[] = "ld";
|
|||
static char linker_placeholder[sizeof(LoadedModule)] ALIGNED(64);
|
||||
static LoadedModule *linker = nullptr;
|
||||
|
||||
static bool IsLinker(const char* full_name) {
|
||||
return LibraryNameIs(full_name, kLinkerName);
|
||||
static bool IsLinker(const LoadedModule& module) {
|
||||
#if SANITIZER_USE_GETAUXVAL
|
||||
return module.base_address() == getauxval(AT_BASE);
|
||||
#else
|
||||
return LibraryNameIs(module.full_name(), kLinkerName);
|
||||
#endif // SANITIZER_USE_GETAUXVAL
|
||||
}
|
||||
|
||||
__attribute__((tls_model("initial-exec")))
|
||||
|
@ -49,22 +57,25 @@ void InitializePlatformSpecificModules() {
|
|||
ListOfModules modules;
|
||||
modules.init();
|
||||
for (LoadedModule &module : modules) {
|
||||
if (!IsLinker(module.full_name())) continue;
|
||||
if (!IsLinker(module))
|
||||
continue;
|
||||
if (linker == nullptr) {
|
||||
linker = reinterpret_cast<LoadedModule *>(linker_placeholder);
|
||||
*linker = module;
|
||||
module = LoadedModule();
|
||||
} else {
|
||||
VReport(1, "LeakSanitizer: Multiple modules match \"%s\". "
|
||||
"TLS will not be handled correctly.\n", kLinkerName);
|
||||
"TLS and other allocations originating from linker might be "
|
||||
"falsely reported as leaks.\n", kLinkerName);
|
||||
linker->clear();
|
||||
linker = nullptr;
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (linker == nullptr) {
|
||||
VReport(1, "LeakSanitizer: Dynamic linker not found. "
|
||||
"TLS will not be handled correctly.\n");
|
||||
VReport(1, "LeakSanitizer: Dynamic linker not found. TLS and other "
|
||||
"allocations originating from linker might be falsely reported "
|
||||
"as leaks.\n");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -77,16 +77,6 @@ extern char **environ; // provided by crt1
|
|||
#include <sys/signal.h>
|
||||
#endif
|
||||
|
||||
#ifndef __GLIBC_PREREQ
|
||||
#define __GLIBC_PREREQ(x, y) 0
|
||||
#endif
|
||||
|
||||
#if SANITIZER_LINUX && __GLIBC_PREREQ(2, 16)
|
||||
# define SANITIZER_USE_GETAUXVAL 1
|
||||
#else
|
||||
# define SANITIZER_USE_GETAUXVAL 0
|
||||
#endif
|
||||
|
||||
#if SANITIZER_USE_GETAUXVAL
|
||||
#include <sys/auxv.h>
|
||||
#endif
|
||||
|
|
|
@ -269,5 +269,14 @@
|
|||
# define SANITIZER_SUPPRESS_LEAK_ON_PTHREAD_EXIT 0
|
||||
#endif
|
||||
|
||||
#ifndef __GLIBC_PREREQ
|
||||
#define __GLIBC_PREREQ(x, y) 0
|
||||
#endif
|
||||
|
||||
#if SANITIZER_LINUX && __GLIBC_PREREQ(2, 16)
|
||||
# define SANITIZER_USE_GETAUXVAL 1
|
||||
#else
|
||||
# define SANITIZER_USE_GETAUXVAL 0
|
||||
#endif
|
||||
|
||||
#endif // SANITIZER_PLATFORM_H
|
||||
|
|
Loading…
Reference in New Issue