diff options
author | Ivan Lozano <ivanlozano@google.com> | 2020-11-16 10:56:18 -0500 |
---|---|---|
committer | Ivan Lozano <ivanlozano@google.com> | 2020-11-16 10:56:18 -0500 |
commit | d4c94dacf666d5ad26d334b2a48d0d63ee31b972 (patch) | |
tree | dcca0f982ff65985e39090821fa74fcea2f3bee4 /libfuzzer/FuzzerExtFunctionsDlsym.cpp | |
parent | 0e1e755ed95b5465d8a78f52836ebfe072dd1f41 (diff) | |
download | libfuzzer-sys-d4c94dacf666d5ad26d334b2a48d0d63ee31b972.tar.gz |
Import libfuzzer-sys Rust Crate
Bug: 147140513
Test: N/A
Change-Id: I3be474604ebb26642b8f7f536ee3e77bd8ce2469
Diffstat (limited to 'libfuzzer/FuzzerExtFunctionsDlsym.cpp')
-rw-r--r-- | libfuzzer/FuzzerExtFunctionsDlsym.cpp | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/libfuzzer/FuzzerExtFunctionsDlsym.cpp b/libfuzzer/FuzzerExtFunctionsDlsym.cpp new file mode 100644 index 0000000..95233d2 --- /dev/null +++ b/libfuzzer/FuzzerExtFunctionsDlsym.cpp @@ -0,0 +1,51 @@ +//===- FuzzerExtFunctionsDlsym.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 operating systems that support dlsym(). We only use it on +// Apple platforms for now. We don't use this approach on Linux because it +// requires that clients of LibFuzzer pass ``--export-dynamic`` to the linker. +// That is a complication we don't wish to expose to clients right now. +//===----------------------------------------------------------------------===// +#include "FuzzerPlatform.h" +#if LIBFUZZER_APPLE + +#include "FuzzerExtFunctions.h" +#include "FuzzerIO.h" +#include <dlfcn.h> + +using namespace fuzzer; + +template <typename T> +static T GetFnPtr(const char *FnName, bool WarnIfMissing) { + dlerror(); // Clear any previous errors. + void *Fn = dlsym(RTLD_DEFAULT, FnName); + if (Fn == nullptr) { + if (WarnIfMissing) { + const char *ErrorMsg = dlerror(); + Printf("WARNING: Failed to find function \"%s\".", FnName); + if (ErrorMsg) + Printf(" Reason %s.", ErrorMsg); + Printf("\n"); + } + } + return reinterpret_cast<T>(Fn); +} + +namespace fuzzer { + +ExternalFunctions::ExternalFunctions() { +#define EXT_FUNC(NAME, RETURN_TYPE, FUNC_SIG, WARN) \ + this->NAME = GetFnPtr<decltype(ExternalFunctions::NAME)>(#NAME, WARN) + +#include "FuzzerExtFunctions.def" + +#undef EXT_FUNC +} + +} // namespace fuzzer + +#endif // LIBFUZZER_APPLE |