xref: /netbsd-src/sys/external/bsd/compiler_rt/dist/lib/interception/interception_linux.h (revision a7c257b03e4462df2b1020128fb82716512d7856)
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