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