brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.9 KiB · 3ef758d Raw
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