110ab2aceSGeorge Karpenkov //===- FuzzerExtFunctionsWeak.cpp - Interface to external functions -------===//
210ab2aceSGeorge Karpenkov //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
610ab2aceSGeorge Karpenkov //
710ab2aceSGeorge Karpenkov //===----------------------------------------------------------------------===//
810ab2aceSGeorge Karpenkov // Implementation for Linux. This relies on the linker's support for weak
910ab2aceSGeorge Karpenkov // symbols. We don't use this approach on Apple platforms because it requires
1010ab2aceSGeorge Karpenkov // clients of LibFuzzer to pass ``-U _<symbol_name>`` to the linker to allow
1110ab2aceSGeorge Karpenkov // weak symbols to be undefined. That is a complication we don't want to expose
1210ab2aceSGeorge Karpenkov // to clients right now.
1310ab2aceSGeorge Karpenkov //===----------------------------------------------------------------------===//
14226866e1SDokyung Song #include "FuzzerPlatform.h"
159802089eSVitaly Buka #if LIBFUZZER_LINUX || LIBFUZZER_NETBSD || LIBFUZZER_FUCHSIA || \
16*53065c54SDavid Carlier LIBFUZZER_FREEBSD || LIBFUZZER_EMSCRIPTEN
1710ab2aceSGeorge Karpenkov
1810ab2aceSGeorge Karpenkov #include "FuzzerExtFunctions.h"
1910ab2aceSGeorge Karpenkov #include "FuzzerIO.h"
2010ab2aceSGeorge Karpenkov
2110ab2aceSGeorge Karpenkov extern "C" {
2210ab2aceSGeorge Karpenkov // Declare these symbols as weak to allow them to be optionally defined.
2310ab2aceSGeorge Karpenkov #define EXT_FUNC(NAME, RETURN_TYPE, FUNC_SIG, WARN) \
241e1f3c82SMatt Morehouse __attribute__((weak, visibility("default"))) RETURN_TYPE NAME FUNC_SIG
2510ab2aceSGeorge Karpenkov
2610ab2aceSGeorge Karpenkov #include "FuzzerExtFunctions.def"
2710ab2aceSGeorge Karpenkov
2810ab2aceSGeorge Karpenkov #undef EXT_FUNC
2910ab2aceSGeorge Karpenkov }
3010ab2aceSGeorge Karpenkov
3110ab2aceSGeorge Karpenkov using namespace fuzzer;
3210ab2aceSGeorge Karpenkov
CheckFnPtr(void * FnPtr,const char * FnName,bool WarnIfMissing)3310ab2aceSGeorge Karpenkov static void CheckFnPtr(void *FnPtr, const char *FnName, bool WarnIfMissing) {
3410ab2aceSGeorge Karpenkov if (FnPtr == nullptr && WarnIfMissing) {
3510ab2aceSGeorge Karpenkov Printf("WARNING: Failed to find function \"%s\".\n", FnName);
3610ab2aceSGeorge Karpenkov }
3710ab2aceSGeorge Karpenkov }
3810ab2aceSGeorge Karpenkov
3910ab2aceSGeorge Karpenkov namespace fuzzer {
4010ab2aceSGeorge Karpenkov
ExternalFunctions()4110ab2aceSGeorge Karpenkov ExternalFunctions::ExternalFunctions() {
4210ab2aceSGeorge Karpenkov #define EXT_FUNC(NAME, RETURN_TYPE, FUNC_SIG, WARN) \
4310ab2aceSGeorge Karpenkov this->NAME = ::NAME; \
4410ab2aceSGeorge Karpenkov CheckFnPtr(reinterpret_cast<void *>(reinterpret_cast<uintptr_t>(::NAME)), \
4510ab2aceSGeorge Karpenkov #NAME, WARN);
4610ab2aceSGeorge Karpenkov
4710ab2aceSGeorge Karpenkov #include "FuzzerExtFunctions.def"
4810ab2aceSGeorge Karpenkov
4910ab2aceSGeorge Karpenkov #undef EXT_FUNC
5010ab2aceSGeorge Karpenkov }
5110ab2aceSGeorge Karpenkov
5210ab2aceSGeorge Karpenkov } // namespace fuzzer
5310ab2aceSGeorge Karpenkov
549802089eSVitaly Buka #endif
55