| //===- FuzzerExtFunctionsWeak.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 Linux. This relies on the linker's support for weak | |
| // symbols. We don't use this approach on Apple platforms because it requires | |
| // clients of LibFuzzer to pass ``-U _<symbol_name>`` to the linker to allow | |
| // weak symbols to be undefined. That is a complication we don't want to expose | |
| // to clients right now. | |
| //===----------------------------------------------------------------------===// | |
| #include "FuzzerPlatform.h" | |
| #if LIBFUZZER_LINUX || LIBFUZZER_NETBSD || LIBFUZZER_FUCHSIA || \ | |
| LIBFUZZER_FREEBSD || LIBFUZZER_EMSCRIPTEN | |
| #include "FuzzerExtFunctions.h" | |
| #include "FuzzerIO.h" | |
| extern "C" { | |
| // Declare these symbols as weak to allow them to be optionally defined. | |
| #define EXT_FUNC(NAME, RETURN_TYPE, FUNC_SIG, WARN) \ | |
| __attribute__((weak, visibility("default"))) RETURN_TYPE NAME FUNC_SIG | |
| #include "FuzzerExtFunctions.def" | |
| #undef EXT_FUNC | |
| } | |
| using namespace fuzzer; | |
| static void CheckFnPtr(void *FnPtr, const char *FnName, bool WarnIfMissing) { | |
| if (FnPtr == nullptr && WarnIfMissing) { | |
| Printf("WARNING: Failed to find function \"%s\".\n", FnName); | |
| } | |
| } | |
| namespace fuzzer { | |
| ExternalFunctions::ExternalFunctions() { | |
| #define EXT_FUNC(NAME, RETURN_TYPE, FUNC_SIG, WARN) \ | |
| this->NAME = ::NAME; \ | |
| CheckFnPtr(reinterpret_cast<void *>(reinterpret_cast<uintptr_t>(::NAME)), \ | |
| #NAME, WARN); | |
| #include "FuzzerExtFunctions.def" | |
| #undef EXT_FUNC | |
| } | |
| } // namespace fuzzer | |
| #endif |