1*a7c257b0Skamil //===- FuzzerExtFunctionsDlsym.cpp - Interface to external functions ------===// 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 // Implementation for operating systems that support dlsym(). We only use it on 10*a7c257b0Skamil // Apple platforms for now. We don't use this approach on Linux because it 11*a7c257b0Skamil // requires that clients of LibFuzzer pass ``--export-dynamic`` to the linker. 12*a7c257b0Skamil // That is a complication we don't wish to expose to clients right now. 13*a7c257b0Skamil //===----------------------------------------------------------------------===// 14*a7c257b0Skamil #include "FuzzerDefs.h" 15*a7c257b0Skamil #if LIBFUZZER_APPLE 16*a7c257b0Skamil 17*a7c257b0Skamil #include "FuzzerExtFunctions.h" 18*a7c257b0Skamil #include "FuzzerIO.h" 19*a7c257b0Skamil #include <dlfcn.h> 20*a7c257b0Skamil 21*a7c257b0Skamil using namespace fuzzer; 22*a7c257b0Skamil 23*a7c257b0Skamil template <typename T> GetFnPtr(const char * FnName,bool WarnIfMissing)24*a7c257b0Skamilstatic T GetFnPtr(const char *FnName, bool WarnIfMissing) { 25*a7c257b0Skamil dlerror(); // Clear any previous errors. 26*a7c257b0Skamil void *Fn = dlsym(RTLD_DEFAULT, FnName); 27*a7c257b0Skamil if (Fn == nullptr) { 28*a7c257b0Skamil if (WarnIfMissing) { 29*a7c257b0Skamil const char *ErrorMsg = dlerror(); 30*a7c257b0Skamil Printf("WARNING: Failed to find function \"%s\".", FnName); 31*a7c257b0Skamil if (ErrorMsg) 32*a7c257b0Skamil Printf(" Reason %s.", ErrorMsg); 33*a7c257b0Skamil Printf("\n"); 34*a7c257b0Skamil } 35*a7c257b0Skamil } 36*a7c257b0Skamil return reinterpret_cast<T>(Fn); 37*a7c257b0Skamil } 38*a7c257b0Skamil 39*a7c257b0Skamil namespace fuzzer { 40*a7c257b0Skamil ExternalFunctions()41*a7c257b0SkamilExternalFunctions::ExternalFunctions() { 42*a7c257b0Skamil #define EXT_FUNC(NAME, RETURN_TYPE, FUNC_SIG, WARN) \ 43*a7c257b0Skamil this->NAME = GetFnPtr<decltype(ExternalFunctions::NAME)>(#NAME, WARN) 44*a7c257b0Skamil 45*a7c257b0Skamil #include "FuzzerExtFunctions.def" 46*a7c257b0Skamil 47*a7c257b0Skamil #undef EXT_FUNC 48*a7c257b0Skamil } 49*a7c257b0Skamil 50*a7c257b0Skamil } // namespace fuzzer 51*a7c257b0Skamil 52*a7c257b0Skamil #endif // LIBFUZZER_APPLE 53