1*a7c257b0Skamil //===-- interception_linux.h ------------------------------------*- C++ -*-===// 2*a7c257b0Skamil // 3*a7c257b0Skamil // The LLVM Compiler Infrastructure 4*a7c257b0Skamil // 5*a7c257b0Skamil // This file is distributed under the University of Illinois Open Source 6*a7c257b0Skamil // License. See LICENSE.TXT for details. 7*a7c257b0Skamil // 8*a7c257b0Skamil //===----------------------------------------------------------------------===// 9*a7c257b0Skamil // 10*a7c257b0Skamil // This file is a part of AddressSanitizer, an address sanity checker. 11*a7c257b0Skamil // 12*a7c257b0Skamil // Linux-specific interception methods. 13*a7c257b0Skamil //===----------------------------------------------------------------------===// 14*a7c257b0Skamil 15*a7c257b0Skamil #if SANITIZER_LINUX || SANITIZER_FREEBSD || SANITIZER_NETBSD || \ 16*a7c257b0Skamil SANITIZER_OPENBSD || SANITIZER_SOLARIS 17*a7c257b0Skamil 18*a7c257b0Skamil #if !defined(INCLUDED_FROM_INTERCEPTION_LIB) 19*a7c257b0Skamil # error "interception_linux.h should be included from interception library only" 20*a7c257b0Skamil #endif 21*a7c257b0Skamil 22*a7c257b0Skamil #ifndef INTERCEPTION_LINUX_H 23*a7c257b0Skamil #define INTERCEPTION_LINUX_H 24*a7c257b0Skamil 25*a7c257b0Skamil namespace __interception { 26*a7c257b0Skamil // returns true if a function with the given name was found. 27*a7c257b0Skamil bool GetRealFunctionAddress(const char *func_name, uptr *func_addr, 28*a7c257b0Skamil uptr real, uptr wrapper); 29*a7c257b0Skamil void *GetFuncAddrVer(const char *func_name, const char *ver); 30*a7c257b0Skamil } // namespace __interception 31*a7c257b0Skamil 32*a7c257b0Skamil #define INTERCEPT_FUNCTION_LINUX_OR_FREEBSD(func) \ 33*a7c257b0Skamil ::__interception::GetRealFunctionAddress( \ 34*a7c257b0Skamil #func, (::__interception::uptr *)&__interception::PTR_TO_REAL(func), \ 35*a7c257b0Skamil (::__interception::uptr) & (func), \ 36*a7c257b0Skamil (::__interception::uptr) & WRAP(func)) 37*a7c257b0Skamil 38*a7c257b0Skamil // Android, Solaris and OpenBSD do not have dlvsym 39*a7c257b0Skamil #if !SANITIZER_ANDROID && !SANITIZER_SOLARIS && !SANITIZER_OPENBSD 40*a7c257b0Skamil #define INTERCEPT_FUNCTION_VER_LINUX_OR_FREEBSD(func, symver) \ 41*a7c257b0Skamil (::__interception::real_##func = (func##_type)( \ 42*a7c257b0Skamil unsigned long)::__interception::GetFuncAddrVer(#func, symver)) 43*a7c257b0Skamil #else 44*a7c257b0Skamil #define INTERCEPT_FUNCTION_VER_LINUX_OR_FREEBSD(func, symver) \ 45*a7c257b0Skamil INTERCEPT_FUNCTION_LINUX_OR_FREEBSD(func) 46*a7c257b0Skamil #endif // !SANITIZER_ANDROID && !SANITIZER_SOLARIS 47*a7c257b0Skamil 48*a7c257b0Skamil #endif // INTERCEPTION_LINUX_H 49*a7c257b0Skamil #endif // SANITIZER_LINUX || SANITIZER_FREEBSD || SANITIZER_NETBSD || 50*a7c257b0Skamil // SANITIZER_OPENBSD || SANITIZER_SOLARIS 51