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