Home | History | Annotate | Line # | Download | only in fuzzer
      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>
     24 static 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 
     41 ExternalFunctions::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