From: Timur Iskhodzhanov Date: Thu, 10 Jul 2014 10:33:48 +0000 (+0000) Subject: [ASan/Win] Don't hardcode ASan runtime version in ASan dll thunk X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=3eb1f4bb9096d26132f3e524ca3908fcc90b22f8;p=platform%2Fupstream%2Fllvm.git [ASan/Win] Don't hardcode ASan runtime version in ASan dll thunk Reviewed at http://reviews.llvm.org/D4459 llvm-svn: 212699 --- diff --git a/compiler-rt/lib/asan/asan_dll_thunk.cc b/compiler-rt/lib/asan/asan_dll_thunk.cc index 7b6ccc6..a3fbb27 100644 --- a/compiler-rt/lib/asan/asan_dll_thunk.cc +++ b/compiler-rt/lib/asan/asan_dll_thunk.cc @@ -20,6 +20,7 @@ // Using #ifdef rather than relying on Makefiles etc. // simplifies the build procedure. #ifdef ASAN_DLL_THUNK +#include "asan_init_version.h" #include "sanitizer_common/sanitizer_interception.h" // ---------- Function interception helper functions and macros ----------- {{{1 @@ -203,13 +204,13 @@ extern "C" { // Manually wrap __asan_init as we need to initialize // __asan_option_detect_stack_use_after_return afterwards. - void __asan_init_v4() { + void __asan_init() { typedef void (*fntype)(); static fntype fn = 0; - // __asan_init_v4 is expected to be called by only one thread. + // __asan_init is expected to be called by only one thread. if (fn) return; - fn = (fntype)getRealProcAddressOrDie("__asan_init_v4"); + fn = (fntype)getRealProcAddressOrDie(__asan_init_name); fn(); __asan_option_detect_stack_use_after_return = (__asan_should_detect_stack_use_after_return() != 0); @@ -339,7 +340,7 @@ void InterceptHooks() { // In DLLs, the callbacks are expected to return 0, // otherwise CRT initialization fails. static int call_asan_init() { - __asan_init_v4(); + __asan_init(); return 0; } #pragma section(".CRT$XIB", long, read) // NOLINT diff --git a/compiler-rt/lib/asan/asan_init_version.h b/compiler-rt/lib/asan/asan_init_version.h new file mode 100644 index 0000000..88eb80f --- /dev/null +++ b/compiler-rt/lib/asan/asan_init_version.h @@ -0,0 +1,37 @@ +//===-- asan_init_version.h -------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file is a part of AddressSanitizer, an address sanity checker. +// +// This header defines a versioned __asan_init function to be called at the +// startup of the instrumented program. +//===----------------------------------------------------------------------===// +#ifndef ASAN_INIT_VERSION_H +#define ASAN_INIT_VERSION_H + +#include "sanitizer_common/sanitizer_internal_defs.h" + +extern "C" { + // This function should be called at the very beginning of the process, + // before any instrumented code is executed and before any call to malloc. + // Every time the ASan ABI changes we also change the version number in this + // name. Objects build with incompatible ASan ABI version + // will not link with run-time. + // Changes between ABI versions: + // v1=>v2: added 'module_name' to __asan_global + // v2=>v3: stack frame description (created by the compiler) + // contains the function PC as the 3-rd field (see + // DescribeAddressIfStack). + // v3=>v4: added '__asan_global_source_location' to __asan_global. + SANITIZER_INTERFACE_ATTRIBUTE void __asan_init_v4(); + #define __asan_init __asan_init_v4 + #define __asan_init_name "__asan_init_v4" +} + +#endif // ASAN_INIT_VERSION_H diff --git a/compiler-rt/lib/asan/asan_interface_internal.h b/compiler-rt/lib/asan/asan_interface_internal.h index 9395341..32629ea 100644 --- a/compiler-rt/lib/asan/asan_interface_internal.h +++ b/compiler-rt/lib/asan/asan_interface_internal.h @@ -17,23 +17,11 @@ #include "sanitizer_common/sanitizer_internal_defs.h" +#include "asan_init_version.h" + using __sanitizer::uptr; extern "C" { - // This function should be called at the very beginning of the process, - // before any instrumented code is executed and before any call to malloc. - // Every time the asan ABI changes we also change the version number in this - // name. Objects build with incompatible asan ABI version - // will not link with run-time. - // Changes between ABI versions: - // v1=>v2: added 'module_name' to __asan_global - // v2=>v3: stack frame description (created by the compiler) - // contains the function PC as the 3-rd field (see - // DescribeAddressIfStack). - // v3=>v4: added '__asan_global_source_location' to __asan_global. - SANITIZER_INTERFACE_ATTRIBUTE void __asan_init_v4(); - #define __asan_init __asan_init_v4 - // This structure is used to describe the source location of a place where // global was defined. struct __asan_global_source_location { diff --git a/compiler-rt/test/asan/TestCases/Darwin/interface_symbols_darwin.c b/compiler-rt/test/asan/TestCases/Darwin/interface_symbols_darwin.c index ea3e796..e513954 100644 --- a/compiler-rt/test/asan/TestCases/Darwin/interface_symbols_darwin.c +++ b/compiler-rt/test/asan/TestCases/Darwin/interface_symbols_darwin.c @@ -16,6 +16,7 @@ // RUN: | grep -v "__asan_on_error" > %t.symbols // RUN: cat %p/../../../../lib/asan/asan_interface_internal.h \ +// RUN: %p/../../../../lib/asan/asan_init_version.h \ // RUN: | sed "s/\/\/.*//" | sed "s/typedef.*//" \ // RUN: | grep -v "OPTIONAL" \ // RUN: | grep "__asan_.*(" | sed "s/.* __asan_/__asan_/;s/(.*//" \ diff --git a/compiler-rt/test/asan/TestCases/Linux/interface_symbols_linux.c b/compiler-rt/test/asan/TestCases/Linux/interface_symbols_linux.c index d496d95..72416f1 100644 --- a/compiler-rt/test/asan/TestCases/Linux/interface_symbols_linux.c +++ b/compiler-rt/test/asan/TestCases/Linux/interface_symbols_linux.c @@ -9,6 +9,7 @@ // RUN: | grep -v "__asan_stack_" \ // RUN: | grep -v "__asan_on_error" > %t.symbols // RUN: cat %p/../../../../lib/asan/asan_interface_internal.h \ +// RUN: %p/../../../../lib/asan/asan_init_version.h \ // RUN: | sed "s/\/\/.*//" | sed "s/typedef.*//" \ // RUN: | grep -v "OPTIONAL" \ // RUN: | grep "__asan_.*(" | sed "s/.* __asan_/__asan_/;s/(.*//" \