diff options
author | Edznux <edznux@gmail.com> | 2020-10-04 16:03:15 +0200 |
---|---|---|
committer | Edznux <edznux@gmail.com> | 2020-10-04 16:03:15 +0200 |
commit | 1e0bc2e5c3fff506bc8bdba9ba96530975c730f1 (patch) | |
tree | 6cfe62b78d6d91482a1f4c240246e14458735856 /custom_mutators/libfuzzer/FuzzerExtFunctionsWeak.cpp | |
parent | b0de6fed11d4a8de8f016f1d8db0cb19a6b96eb2 (diff) | |
parent | 44c0dc6d961853806a07fa05b948686392ea93fc (diff) | |
download | afl++-1e0bc2e5c3fff506bc8bdba9ba96530975c730f1.tar.gz |
Merge remote-tracking branch 'origin/dev' into statsd_implem
Diffstat (limited to 'custom_mutators/libfuzzer/FuzzerExtFunctionsWeak.cpp')
-rw-r--r-- | custom_mutators/libfuzzer/FuzzerExtFunctionsWeak.cpp | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/custom_mutators/libfuzzer/FuzzerExtFunctionsWeak.cpp b/custom_mutators/libfuzzer/FuzzerExtFunctionsWeak.cpp new file mode 100644 index 00000000..caf1a7ef --- /dev/null +++ b/custom_mutators/libfuzzer/FuzzerExtFunctionsWeak.cpp @@ -0,0 +1,62 @@ +//===- 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_OPENBSD || 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 + |