[compiler-rt] r175623 - [asan] on linux, run __asan_init from .preinit_array (even earlier than before)

Alexey Samsonov samsonov at google.com
Wed Feb 20 06:57:00 PST 2013


On Wed, Feb 20, 2013 at 6:28 PM, Kostya Serebryany <kcc at google.com> wrote:

> Author: kcc
> Date: Wed Feb 20 08:28:08 2013
> New Revision: 175623
>
> URL: http://llvm.org/viewvc/llvm-project?rev=175623&view=rev
> Log:
> [asan] on linux, run __asan_init from .preinit_array (even earlier than
> before)
>
> Added:
>     compiler-rt/trunk/lib/asan/lit_tests/preinit_test.cc
> Modified:
>     compiler-rt/trunk/lib/asan/asan_internal.h
>     compiler-rt/trunk/lib/asan/asan_rtl.cc
>
> Modified: compiler-rt/trunk/lib/asan/asan_internal.h
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_internal.h?rev=175623&r1=175622&r2=175623&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/asan/asan_internal.h (original)
> +++ compiler-rt/trunk/lib/asan/asan_internal.h Wed Feb 20 08:28:08 2013
> @@ -91,6 +91,10 @@
>  # endif
>  #endif
>
> +#ifndef ASAN_USE_PREINIT_ARRAY
> +# define ASAN_USE_PREINIT_ARRAY (ASAN_LINUX && !ASAN_ANDROID)
> +#endif
> +
>  // All internal functions in asan reside inside the __asan namespace
>  // to avoid namespace collisions with the user programs.
>  // Seperate namespace also makes it simpler to distinguish the asan
> run-time
>
> Modified: compiler-rt/trunk/lib/asan/asan_rtl.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_rtl.cc?rev=175623&r1=175622&r2=175623&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/asan/asan_rtl.cc (original)
> +++ compiler-rt/trunk/lib/asan/asan_rtl.cc Wed Feb 20 08:28:08 2013
> @@ -522,12 +522,12 @@ void __asan_init() {
>    }
>  }
>
> -#if defined(ASAN_USE_PREINIT_ARRAY)
> +#if ASAN_USE_PREINIT_ARRAY
>    // On Linux, we force __asan_init to be called before anyone else
>    // by placing it into .preinit_array section.
>    // FIXME: do we have anything like this on Mac?
>    __attribute__((section(".preinit_array")))
> -    typeof(__asan_init) *__asan_preinit =__asan_init;
> +  void (*__asan_preinit)(void) =__asan_init;
>  #elif defined(_WIN32) && defined(_DLL)
>    // On Windows, when using dynamic CRT (/MD), we can put a pointer
>    // to __asan_init into the global list of C initializers.
>
> Added: compiler-rt/trunk/lib/asan/lit_tests/preinit_test.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/lit_tests/preinit_test.cc?rev=175623&view=auto
>
> ==============================================================================
> --- compiler-rt/trunk/lib/asan/lit_tests/preinit_test.cc (added)
> +++ compiler-rt/trunk/lib/asan/lit_tests/preinit_test.cc Wed Feb 20
> 08:28:08 2013
>

Shouldn't this test be run on Linux only?


> @@ -0,0 +1,27 @@
> +// RUN: %clangxx      -DFUNC=zzzz %s -shared -o %t.so -fPIC
> +// RUN: %clangxx_asan -DFUNC=main %s         -o %t    -Wl,-R. %t.so
> +// RUN: %t
> +
> +// This test ensures that we call __asan_init early enough.
> +// We build a shared library w/o asan instrumentation
> +// and the binary with asan instrumentation.
> +// Both files include the same header (emulated by -DFUNC here)
> +// with C++ template magic which runs global initializer at library load
> time.
> +// The function get() is instrumented with asan, but called
> +// before the usual constructors are run.
> +// So, we must make sure that __asan_init is executed even earlier.
> +//
> +// See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56393
> +
> +struct A {
> +  int foo() const { return 0; }
> +};
> +A get () { return A(); }
> +template <class> struct O {
> +  static A const e;
> +};
> +template <class T> A const O <T>::e = get();
> +int FUNC() {
> +  return O<int>::e.foo();
> +}
> +
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>



-- 
Alexey Samsonov, MSK
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20130220/610c5806/attachment.html>


More information about the llvm-commits mailing list