| //===- FuzzerExtFunctionsDlsym.cpp - Interface to external functions ------===// | 
 | // | 
 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | 
 | // See https://llvm.org/LICENSE.txt for license information. | 
 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
 | // | 
 | //===----------------------------------------------------------------------===// | 
 | // Implementation for operating systems that support dlsym(). We only use it on | 
 | // Apple platforms for now. We don't use this approach on Linux because it | 
 | // requires that clients of LibFuzzer pass ``--export-dynamic`` to the linker. | 
 | // That is a complication we don't wish to expose to clients right now. | 
 | //===----------------------------------------------------------------------===// | 
 | #include "FuzzerPlatform.h" | 
 | #if LIBFUZZER_APPLE | 
 |  | 
 | #include "FuzzerExtFunctions.h" | 
 | #include "FuzzerIO.h" | 
 | #include <dlfcn.h> | 
 |  | 
 | using namespace fuzzer; | 
 |  | 
 | template <typename T> | 
 | static T GetFnPtr(const char *FnName, bool WarnIfMissing) { | 
 |   dlerror(); // Clear any previous errors. | 
 |   void *Fn = dlsym(RTLD_DEFAULT, FnName); | 
 |   if (Fn == nullptr) { | 
 |     if (WarnIfMissing) { | 
 |       const char *ErrorMsg = dlerror(); | 
 |       Printf("WARNING: Failed to find function \"%s\".", FnName); | 
 |       if (ErrorMsg) | 
 |         Printf(" Reason %s.", ErrorMsg); | 
 |       Printf("\n"); | 
 |     } | 
 |   } | 
 |   return reinterpret_cast<T>(Fn); | 
 | } | 
 |  | 
 | namespace fuzzer { | 
 |  | 
 | ExternalFunctions::ExternalFunctions() { | 
 | #define EXT_FUNC(NAME, RETURN_TYPE, FUNC_SIG, WARN)                            \ | 
 |   this->NAME = GetFnPtr<decltype(ExternalFunctions::NAME)>(#NAME, WARN) | 
 |  | 
 | #include "FuzzerExtFunctions.def" | 
 |  | 
 | #undef EXT_FUNC | 
 | } | 
 |  | 
 | } // namespace fuzzer | 
 |  | 
 | #endif // LIBFUZZER_APPLE |