1 1.1 kamil //===-- interception_linux.cc -----------------------------------*- C++ -*-===// 2 1.1 kamil // 3 1.1 kamil // The LLVM Compiler Infrastructure 4 1.1 kamil // 5 1.1 kamil // This file is distributed under the University of Illinois Open Source 6 1.1 kamil // License. See LICENSE.TXT for details. 7 1.1 kamil // 8 1.1 kamil //===----------------------------------------------------------------------===// 9 1.1 kamil // 10 1.1 kamil // This file is a part of AddressSanitizer, an address sanity checker. 11 1.1 kamil // 12 1.1 kamil // Linux-specific interception methods. 13 1.1 kamil //===----------------------------------------------------------------------===// 14 1.1 kamil 15 1.1 kamil #include "interception.h" 16 1.1 kamil 17 1.1 kamil #if SANITIZER_LINUX || SANITIZER_FREEBSD || SANITIZER_NETBSD || \ 18 1.1 kamil SANITIZER_OPENBSD || SANITIZER_SOLARIS 19 1.1 kamil 20 1.1 kamil #include <dlfcn.h> // for dlsym() and dlvsym() 21 1.1 kamil 22 1.1 kamil #if SANITIZER_NETBSD 23 1.1 kamil #include "sanitizer_common/sanitizer_libc.h" 24 1.1 kamil #endif 25 1.1 kamil 26 1.1 kamil namespace __interception { 27 1.1 kamil bool GetRealFunctionAddress(const char *func_name, uptr *func_addr, 28 1.1 kamil uptr real, uptr wrapper) { 29 1.1 kamil #if SANITIZER_NETBSD 30 1.1 kamil // XXX: Find a better way to handle renames 31 1.2 thorpej // XXX: Do we have to handle the old __sigaction14 name here too? 32 1.2 thorpej if (internal_strcmp(func_name, "sigaction") == 0) func_name = "__sigaction_siginfo"; 33 1.1 kamil #endif 34 1.1 kamil *func_addr = (uptr)dlsym(RTLD_NEXT, func_name); 35 1.1 kamil if (!*func_addr) { 36 1.1 kamil // If the lookup using RTLD_NEXT failed, the sanitizer runtime library is 37 1.1 kamil // later in the library search order than the DSO that we are trying to 38 1.1 kamil // intercept, which means that we cannot intercept this function. We still 39 1.1 kamil // want the address of the real definition, though, so look it up using 40 1.1 kamil // RTLD_DEFAULT. 41 1.1 kamil *func_addr = (uptr)dlsym(RTLD_DEFAULT, func_name); 42 1.1 kamil } 43 1.1 kamil return real == wrapper; 44 1.1 kamil } 45 1.1 kamil 46 1.1 kamil // Android and Solaris do not have dlvsym 47 1.1 kamil #if !SANITIZER_ANDROID && !SANITIZER_SOLARIS && !SANITIZER_OPENBSD 48 1.1 kamil void *GetFuncAddrVer(const char *func_name, const char *ver) { 49 1.1 kamil return dlvsym(RTLD_NEXT, func_name, ver); 50 1.1 kamil } 51 1.1 kamil #endif // !SANITIZER_ANDROID 52 1.1 kamil 53 1.1 kamil } // namespace __interception 54 1.1 kamil 55 1.1 kamil #endif // SANITIZER_LINUX || SANITIZER_FREEBSD || SANITIZER_NETBSD || 56 1.1 kamil // SANITIZER_OPENBSD || SANITIZER_SOLARIS 57