[compiler-rt] r315024 - [LSan] Detect dynamic loader by its base address.

Aleksey Shlyapnikov via llvm-commits llvm-commits at lists.llvm.org
Thu Oct 5 15:31:48 PDT 2017


Looking... Will revert shortly.

On Thu, Oct 5, 2017 at 3:21 PM, Hans Wennborg <hans at chromium.org> wrote:

> Looks like it broke this one:
> http://lab.llvm.org:8011/builders/clang-ppc64be-linux/builds/11384
>
> On Thu, Oct 5, 2017 at 2:38 PM, Alex Shlyapnikov via llvm-commits
> <llvm-commits at lists.llvm.org> wrote:
> > Author: alekseyshl
> > Date: Thu Oct  5 14:38:33 2017
> > New Revision: 315024
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=315024&view=rev
> > Log:
> > [LSan] Detect dynamic loader by its base address.
> >
> > Summary:
> > Relanding D33859, which was reverted because it has "broken LOTS of
> > ARM/AArch64 bots for two days".
> >
> > If it breaks something again, please provide some pointers to broken
> > bots, not just revert it, otherwise it's very hard to reason what's
> > wrong with this commit.
> >
> > 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: aemerson, kubamracek, kristof.beyls, llvm-commits
> >
> > Differential Revision: https://reviews.llvm.org/D38600
> >
> > Modified:
> >     compiler-rt/trunk/lib/lsan/lsan_common.cc
> >     compiler-rt/trunk/lib/lsan/lsan_common_linux.cc
> >     compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc
> >     compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform.h
> >
> > Modified: compiler-rt/trunk/lib/lsan/lsan_common.cc
> > URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/
> lsan/lsan_common.cc?rev=315024&r1=315023&r2=315024&view=diff
> > ============================================================
> ==================
> > --- compiler-rt/trunk/lib/lsan/lsan_common.cc (original)
> > +++ compiler-rt/trunk/lib/lsan/lsan_common.cc Thu Oct  5 14:38:33 2017
> > @@ -411,8 +411,9 @@ static void MarkInvalidPCCb(uptr chunk,
> >    }
> >  }
> >
> > -// 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
> >
> > Modified: compiler-rt/trunk/lib/lsan/lsan_common_linux.cc
> > URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/
> lsan/lsan_common_linux.cc?rev=315024&r1=315023&r2=315024&view=diff
> > ============================================================
> ==================
> > --- compiler-rt/trunk/lib/lsan/lsan_common_linux.cc (original)
> > +++ compiler-rt/trunk/lib/lsan/lsan_common_linux.cc Thu Oct  5 14:38:33
> 2017
> > @@ -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");
> >    }
> >  }
> >
> >
> > Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc
> > URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/
> sanitizer_common/sanitizer_linux.cc?rev=315024&r1=315023&
> r2=315024&view=diff
> > ============================================================
> ==================
> > --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc (original)
> > +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc Thu Oct
> 5 14:38:33 2017
> > @@ -93,16 +93,6 @@ extern char **environ;  // provided by c
> >  #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
> >
> > Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform.h
> > URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/
> sanitizer_common/sanitizer_platform.h?rev=315024&r1=
> 315023&r2=315024&view=diff
> > ============================================================
> ==================
> > --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform.h
> (original)
> > +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform.h Thu
> Oct  5 14:38:33 2017
> > @@ -282,5 +282,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
> >
> >
> > _______________________________________________
> > llvm-commits mailing list
> > llvm-commits at lists.llvm.org
> > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20171005/21a7af21/attachment.html>


More information about the llvm-commits mailing list