55 lines · cpp
1//===- FuzzerExtFunctionsWeak.cpp - Interface to external functions -------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8// Implementation for Linux. This relies on the linker's support for weak9// symbols. We don't use this approach on Apple platforms because it requires10// clients of LibFuzzer to pass ``-U _<symbol_name>`` to the linker to allow11// weak symbols to be undefined. That is a complication we don't want to expose12// to clients right now.13//===----------------------------------------------------------------------===//14#include "FuzzerPlatform.h"15#if LIBFUZZER_LINUX || LIBFUZZER_NETBSD || LIBFUZZER_FUCHSIA || \16 LIBFUZZER_FREEBSD || LIBFUZZER_EMSCRIPTEN17 18#include "FuzzerExtFunctions.h"19#include "FuzzerIO.h"20 21extern "C" {22// Declare these symbols as weak to allow them to be optionally defined.23#define EXT_FUNC(NAME, RETURN_TYPE, FUNC_SIG, WARN) \24 __attribute__((weak, visibility("default"))) RETURN_TYPE NAME FUNC_SIG25 26#include "FuzzerExtFunctions.def"27 28#undef EXT_FUNC29}30 31using namespace fuzzer;32 33static void CheckFnPtr(void *FnPtr, const char *FnName, bool WarnIfMissing) {34 if (FnPtr == nullptr && WarnIfMissing) {35 Printf("WARNING: Failed to find function \"%s\".\n", FnName);36 }37}38 39namespace fuzzer {40 41ExternalFunctions::ExternalFunctions() {42#define EXT_FUNC(NAME, RETURN_TYPE, FUNC_SIG, WARN) \43 this->NAME = ::NAME; \44 CheckFnPtr(reinterpret_cast<void *>(reinterpret_cast<uintptr_t>(::NAME)), \45 #NAME, WARN);46 47#include "FuzzerExtFunctions.def"48 49#undef EXT_FUNC50}51 52} // namespace fuzzer53 54#endif55