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