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