//===- NativeDylibAPIs.inc --------------------------------------*- C++ -*-===// // // 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 // //===----------------------------------------------------------------------===// // // Generic wrappers for POSIX dlfcn.h APIs. // //===----------------------------------------------------------------------===// #include "orc-rt/Error.h" #include namespace { orc_rt::Expected hostOSLoadLibrary(const std::string &Path) { void *H = dlopen(Path.c_str(), RTLD_LAZY | RTLD_LOCAL); if (H == nullptr) { std::ostringstream ErrMsg; ErrMsg << "error loading "; if (!Path.empty()) ErrMsg << "\"" << Path << "\""; else ErrMsg << "process symbols"; ErrMsg << ": " << dlerror(); return orc_rt::make_error(ErrMsg.str()); } return H; } orc_rt::Error hostOSUnloadLibrary(void *Handle) { if (dlclose(Handle) != 0) return orc_rt::make_error( (std::ostringstream() << "error unloading " << Handle << ": " << dlerror()) .str()); return orc_rt::Error::success(); } std::vector hostOSLibraryLookup(void *Handle, const std::vector &Names) { std::vector Result; Result.reserve(Names.size()); for (const auto &Name : Names) Result.push_back(dlsym(Handle, Name.c_str())); return Result; } } // anonymous namespace