2016-11-18 03:02:53 +08:00
|
|
|
//===-- asan_globals_win.cc -----------------------------------------------===//
|
|
|
|
//
|
|
|
|
// The LLVM Compiler Infrastructure
|
|
|
|
//
|
|
|
|
// This file is distributed under the University of Illinois Open Source
|
|
|
|
// License. See LICENSE.TXT for details.
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
//
|
|
|
|
// Global registration code that is linked into every Windows DLL and EXE.
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
|
|
#include "asan_interface_internal.h"
|
|
|
|
#if SANITIZER_WINDOWS
|
|
|
|
|
|
|
|
namespace __asan {
|
|
|
|
|
|
|
|
#pragma section(".ASAN$GA", read, write) // NOLINT
|
|
|
|
#pragma section(".ASAN$GZ", read, write) // NOLINT
|
|
|
|
extern "C" __declspec(allocate(".ASAN$GA"))
|
2018-04-27 04:46:50 +08:00
|
|
|
ALIGNED(sizeof(__asan_global)) __asan_global __asan_globals_start = {};
|
2016-11-18 03:02:53 +08:00
|
|
|
extern "C" __declspec(allocate(".ASAN$GZ"))
|
2018-04-27 04:46:50 +08:00
|
|
|
ALIGNED(sizeof(__asan_global)) __asan_global __asan_globals_end = {};
|
2016-11-18 03:02:53 +08:00
|
|
|
#pragma comment(linker, "/merge:.ASAN=.data")
|
|
|
|
|
|
|
|
static void call_on_globals(void (*hook)(__asan_global *, uptr)) {
|
2016-11-24 01:37:00 +08:00
|
|
|
__asan_global *start = &__asan_globals_start + 1;
|
2016-11-24 02:02:16 +08:00
|
|
|
__asan_global *end = &__asan_globals_end;
|
|
|
|
uptr bytediff = (uptr)end - (uptr)start;
|
|
|
|
if (bytediff % sizeof(__asan_global) != 0) {
|
[sanitizer] Split dll_thunks into different sanitizers.
When the sanitizer is implemented as a static library and is included in the
main executable, we need an auxiliary static library dll_thunk that will be
linked to the dlls that have instrumentation, so they can refer to the runtime
in the main executable. Basically, it uses interception to get a pointer the
function in the main executable and override its function with that pointer.
Before this diff, all of the implementation for dll_thunks was included in asan.
In this diff I split it into different sanitizers, so we can use other
sanitizers regardless of whether we include asan or not.
All the sanitizers include a file sanitizer_win_dll_thunk.cc that register
functions to be intercepted in the binary section: DLLTH
When the dll including dll_thunk is initialized, it will execute
__dll_thunk_init() implemented in: sanitizer_common/sanitizer_win_dll_thunk.cc,
which will consider all the CB registered in the section DLLTH. So, all the
functions registered will be intercepted, and redirected to the implementation
in the main executable.
All the files "sanitizer_win_dll_thunk.cc" are independent, so we don't need to
include a specific list of sanitizers. Now, we compile: asan_win_dll_thunk.cc
ubsan_win_dll_thunk.cc, sanitizer_coverage_win_dll_thunk.cc and
sanitizer_win_dll_thunk.cc, to generate asan_dll_thunk, because we include asan,
ubsan and sanitizer coverage in the address sanitizer library.
Differential Revision: https://reviews.llvm.org/D29154
llvm-svn: 293951
2017-02-03 07:01:28 +08:00
|
|
|
#ifdef SANITIZER_DLL_THUNK
|
2016-11-24 02:02:16 +08:00
|
|
|
__debugbreak();
|
|
|
|
#else
|
|
|
|
CHECK("corrupt asan global array");
|
|
|
|
#endif
|
|
|
|
}
|
2016-11-18 03:02:53 +08:00
|
|
|
// We know end >= start because the linker sorts the portion after the dollar
|
|
|
|
// sign alphabetically.
|
|
|
|
uptr n = end - start;
|
|
|
|
hook(start, n);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void register_dso_globals() {
|
|
|
|
call_on_globals(&__asan_register_globals);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void unregister_dso_globals() {
|
|
|
|
call_on_globals(&__asan_unregister_globals);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Register globals
|
|
|
|
#pragma section(".CRT$XCU", long, read) // NOLINT
|
|
|
|
#pragma section(".CRT$XTX", long, read) // NOLINT
|
|
|
|
extern "C" __declspec(allocate(".CRT$XCU"))
|
|
|
|
void (*const __asan_dso_reg_hook)() = ®ister_dso_globals;
|
|
|
|
extern "C" __declspec(allocate(".CRT$XTX"))
|
|
|
|
void (*const __asan_dso_unreg_hook)() = &unregister_dso_globals;
|
|
|
|
|
|
|
|
} // namespace __asan
|
|
|
|
|
|
|
|
#endif // SANITIZER_WINDOWS
|