xref: /llvm-project/compiler-rt/lib/fuzzer/FuzzerExtFunctionsWeak.cpp (revision 53065c543fe3f1e7913c9e8f2487d76034afa249)
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