14ba319b5SDimitry Andric //===- FuzzerExtFunctionsWeak.cpp - Interface to external functions -------===//
24ba319b5SDimitry Andric //
34ba319b5SDimitry Andric // The LLVM Compiler Infrastructure
44ba319b5SDimitry Andric //
54ba319b5SDimitry Andric // This file is distributed under the University of Illinois Open Source
64ba319b5SDimitry Andric // License. See LICENSE.TXT for details.
74ba319b5SDimitry Andric //
84ba319b5SDimitry Andric //===----------------------------------------------------------------------===//
94ba319b5SDimitry Andric // Implementation for Linux. This relies on the linker's support for weak
104ba319b5SDimitry Andric // symbols. We don't use this approach on Apple platforms because it requires
114ba319b5SDimitry Andric // clients of LibFuzzer to pass ``-U _<symbol_name>`` to the linker to allow
124ba319b5SDimitry Andric // weak symbols to be undefined. That is a complication we don't want to expose
134ba319b5SDimitry Andric // to clients right now.
144ba319b5SDimitry Andric //===----------------------------------------------------------------------===//
154ba319b5SDimitry Andric #include "FuzzerDefs.h"
164ba319b5SDimitry Andric #if LIBFUZZER_LINUX || LIBFUZZER_NETBSD || LIBFUZZER_FUCHSIA || \
174ba319b5SDimitry Andric LIBFUZZER_FREEBSD || LIBFUZZER_OPENBSD
184ba319b5SDimitry Andric
194ba319b5SDimitry Andric #include "FuzzerExtFunctions.h"
204ba319b5SDimitry Andric #include "FuzzerIO.h"
214ba319b5SDimitry Andric
224ba319b5SDimitry Andric extern "C" {
234ba319b5SDimitry Andric // Declare these symbols as weak to allow them to be optionally defined.
244ba319b5SDimitry Andric #define EXT_FUNC(NAME, RETURN_TYPE, FUNC_SIG, WARN) \
25*b5893f02SDimitry Andric __attribute__((weak, visibility("default"))) RETURN_TYPE NAME FUNC_SIG
264ba319b5SDimitry Andric
274ba319b5SDimitry Andric #include "FuzzerExtFunctions.def"
284ba319b5SDimitry Andric
294ba319b5SDimitry Andric #undef EXT_FUNC
304ba319b5SDimitry Andric }
314ba319b5SDimitry Andric
324ba319b5SDimitry Andric using namespace fuzzer;
334ba319b5SDimitry Andric
CheckFnPtr(void * FnPtr,const char * FnName,bool WarnIfMissing)344ba319b5SDimitry Andric static void CheckFnPtr(void *FnPtr, const char *FnName, bool WarnIfMissing) {
354ba319b5SDimitry Andric if (FnPtr == nullptr && WarnIfMissing) {
364ba319b5SDimitry Andric Printf("WARNING: Failed to find function \"%s\".\n", FnName);
374ba319b5SDimitry Andric }
384ba319b5SDimitry Andric }
394ba319b5SDimitry Andric
404ba319b5SDimitry Andric namespace fuzzer {
414ba319b5SDimitry Andric
ExternalFunctions()424ba319b5SDimitry Andric ExternalFunctions::ExternalFunctions() {
434ba319b5SDimitry Andric #define EXT_FUNC(NAME, RETURN_TYPE, FUNC_SIG, WARN) \
444ba319b5SDimitry Andric this->NAME = ::NAME; \
454ba319b5SDimitry Andric CheckFnPtr(reinterpret_cast<void *>(reinterpret_cast<uintptr_t>(::NAME)), \
464ba319b5SDimitry Andric #NAME, WARN);
474ba319b5SDimitry Andric
484ba319b5SDimitry Andric #include "FuzzerExtFunctions.def"
494ba319b5SDimitry Andric
504ba319b5SDimitry Andric #undef EXT_FUNC
514ba319b5SDimitry Andric }
524ba319b5SDimitry Andric
534ba319b5SDimitry Andric } // namespace fuzzer
544ba319b5SDimitry Andric
554ba319b5SDimitry Andric #endif
56