1*0b57cec5SDimitry Andric //===-- interception_linux.h ------------------------------------*- C++ -*-===// 2*0b57cec5SDimitry Andric // 3*0b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*0b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*0b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*0b57cec5SDimitry Andric // 7*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 8*0b57cec5SDimitry Andric // 9*0b57cec5SDimitry Andric // This file is a part of AddressSanitizer, an address sanity checker. 10*0b57cec5SDimitry Andric // 11*0b57cec5SDimitry Andric // Linux-specific interception methods. 12*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 13*0b57cec5SDimitry Andric 14*0b57cec5SDimitry Andric #if SANITIZER_LINUX || SANITIZER_FREEBSD || SANITIZER_NETBSD || \ 15*0b57cec5SDimitry Andric SANITIZER_OPENBSD || SANITIZER_SOLARIS 16*0b57cec5SDimitry Andric 17*0b57cec5SDimitry Andric #if !defined(INCLUDED_FROM_INTERCEPTION_LIB) 18*0b57cec5SDimitry Andric # error "interception_linux.h should be included from interception library only" 19*0b57cec5SDimitry Andric #endif 20*0b57cec5SDimitry Andric 21*0b57cec5SDimitry Andric #ifndef INTERCEPTION_LINUX_H 22*0b57cec5SDimitry Andric #define INTERCEPTION_LINUX_H 23*0b57cec5SDimitry Andric 24*0b57cec5SDimitry Andric namespace __interception { 25*0b57cec5SDimitry Andric bool InterceptFunction(const char *name, uptr *ptr_to_real, uptr func, 26*0b57cec5SDimitry Andric uptr wrapper); 27*0b57cec5SDimitry Andric bool InterceptFunction(const char *name, const char *ver, uptr *ptr_to_real, 28*0b57cec5SDimitry Andric uptr func, uptr wrapper); 29*0b57cec5SDimitry Andric } // namespace __interception 30*0b57cec5SDimitry Andric 31*0b57cec5SDimitry Andric #define INTERCEPT_FUNCTION_LINUX_OR_FREEBSD(func) \ 32*0b57cec5SDimitry Andric ::__interception::InterceptFunction( \ 33*0b57cec5SDimitry Andric #func, \ 34*0b57cec5SDimitry Andric (::__interception::uptr *) & REAL(func), \ 35*0b57cec5SDimitry Andric (::__interception::uptr) & (func), \ 36*0b57cec5SDimitry Andric (::__interception::uptr) & WRAP(func)) 37*0b57cec5SDimitry Andric 38*0b57cec5SDimitry Andric // Android, Solaris and OpenBSD do not have dlvsym 39*0b57cec5SDimitry Andric #if !SANITIZER_ANDROID && !SANITIZER_SOLARIS && !SANITIZER_OPENBSD 40*0b57cec5SDimitry Andric #define INTERCEPT_FUNCTION_VER_LINUX_OR_FREEBSD(func, symver) \ 41*0b57cec5SDimitry Andric ::__interception::InterceptFunction( \ 42*0b57cec5SDimitry Andric #func, symver, \ 43*0b57cec5SDimitry Andric (::__interception::uptr *) & REAL(func), \ 44*0b57cec5SDimitry Andric (::__interception::uptr) & (func), \ 45*0b57cec5SDimitry Andric (::__interception::uptr) & WRAP(func)) 46*0b57cec5SDimitry Andric #else 47*0b57cec5SDimitry Andric #define INTERCEPT_FUNCTION_VER_LINUX_OR_FREEBSD(func, symver) \ 48*0b57cec5SDimitry Andric INTERCEPT_FUNCTION_LINUX_OR_FREEBSD(func) 49*0b57cec5SDimitry Andric #endif // !SANITIZER_ANDROID && !SANITIZER_SOLARIS 50*0b57cec5SDimitry Andric 51*0b57cec5SDimitry Andric #endif // INTERCEPTION_LINUX_H 52*0b57cec5SDimitry Andric #endif // SANITIZER_LINUX || SANITIZER_FREEBSD || SANITIZER_NETBSD || 53*0b57cec5SDimitry Andric // SANITIZER_OPENBSD || SANITIZER_SOLARIS 54