interception_linux.h revision fae2bff6de8be5a319ca17fd713731ce8a887476
1e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev//===-- interception_linux.h ------------------------------------*- C++ -*-===// 2e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev// 3e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev// The LLVM Compiler Infrastructure 4e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev// 5e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev// This file is distributed under the University of Illinois Open Source 6e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev// License. See LICENSE.TXT for details. 7e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev// 8e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev//===----------------------------------------------------------------------===// 9e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev// 10e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev// This file is a part of AddressSanitizer, an address sanity checker. 11e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev// 12e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev// Linux-specific interception methods. 13e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev//===----------------------------------------------------------------------===// 14e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 15e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#ifdef __linux__ 16e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 17e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#if !defined(INCLUDED_FROM_INTERCEPTION_LIB) 18e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev# error "interception_linux.h should be included from interception library only" 19e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#endif 20e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 21e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#ifndef INTERCEPTION_LINUX_H 22e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define INTERCEPTION_LINUX_H 23e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 24e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevnamespace __interception { 25e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev// returns true if a function with the given name was found. 26e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevbool GetRealFunctionAddress(const char *func_name, uptr *func_addr, 27e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev uptr real, uptr wrapper); 28e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevvoid *GetFuncAddrVer(const char *func_name, const char *ver); 29e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev} // namespace __interception 30e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 31e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define INTERCEPT_FUNCTION_LINUX(func) \ 32e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev ::__interception::GetRealFunctionAddress( \ 33e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev #func, (::__interception::uptr*)&REAL(func), \ 34e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev (::__interception::uptr)&(func), \ 35e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev (::__interception::uptr)&WRAP(func)) 36e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 37e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#if !defined(__ANDROID__) // android does not have dlvsym 38e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define INTERCEPT_FUNCTION_VER(func, symver) \ 39e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev ::__interception::real_##func = (func##_f)(unsigned long) \ 40e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev ::__interception::GetFuncAddrVer(#func, #symver) 41e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#endif // !defined(__ANDROID__) 42e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 43e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#endif // INTERCEPTION_LINUX_H 44e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#endif // __linux__ 45e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev