Index: lib/Fuzzer/FuzzerExtFunctionsWeakAlias.cpp =================================================================== --- lib/Fuzzer/FuzzerExtFunctionsWeakAlias.cpp +++ lib/Fuzzer/FuzzerExtFunctionsWeakAlias.cpp @@ -18,12 +18,15 @@ extern "C" { // Declare these symbols as weak to allow them to be optionally defined. +// Default implementation of weak functions are exported with the __dll suffix, +// so we need to check if "fun" or "fun__dll" is present. #define EXT_FUNC(NAME, RETURN_TYPE, FUNC_SIG, WARN) \ RETURN_TYPE NAME##Def FUNC_SIG { \ Printf("ERROR: Function \"%s\" not defined.\n", #NAME); \ exit(1); \ } \ - RETURN_TYPE NAME FUNC_SIG __attribute__((weak, alias(#NAME "Def"))); + RETURN_TYPE NAME FUNC_SIG __attribute__((weak, alias(#NAME "Def"))); \ + RETURN_TYPE NAME##__dll FUNC_SIG __attribute__((weak, alias(#NAME "Def"))); #include "FuzzerExtFunctions.def" @@ -31,20 +34,23 @@ } template -static T *GetFnPtr(T *Fun, T *FunDef, const char *FnName, bool WarnIfMissing) { - if (Fun == FunDef) { - if (WarnIfMissing) - Printf("WARNING: Failed to find function \"%s\".\n", FnName); - return nullptr; - } - return Fun; +static T *GetFnPtr(T *Fun, T *FunDll, T *FunDef, const char *FnName, + bool WarnIfMissing) { + if (Fun != FunDef) + return Fun; + if (FunDll != FunDef) + return FunDll; + if (WarnIfMissing) + Printf("WARNING: Failed to find function \"%s\".\n", FnName); + return nullptr; } namespace fuzzer { ExternalFunctions::ExternalFunctions() { #define EXT_FUNC(NAME, RETURN_TYPE, FUNC_SIG, WARN) \ - this->NAME = GetFnPtr(::NAME, ::NAME##Def, #NAME, WARN); + this->NAME = GetFnPtr(::NAME, ::NAME##__dll, ::NAME##Def, \ + #NAME, WARN); #include "FuzzerExtFunctions.def"