NativeDylibManager is an orc_rt::Service that supports loading, unloading, and lookup of symbols via the system dynamic loader's native APIs. The current implementation only supports the POSIX dlfcn.h APIs (dlopen, dlclose, dlsym), but it should be straightforward to extend to Windows.
54 lines
1.6 KiB
C++
54 lines
1.6 KiB
C++
//===- 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 <dlfcn.h>
|
|
|
|
namespace {
|
|
|
|
orc_rt::Expected<void *> 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<orc_rt::StringError>(ErrMsg.str());
|
|
}
|
|
|
|
return H;
|
|
}
|
|
|
|
orc_rt::Error hostOSUnloadLibrary(void *Handle) {
|
|
if (dlclose(Handle) != 0)
|
|
return orc_rt::make_error<orc_rt::StringError>(
|
|
(std::ostringstream()
|
|
<< "error unloading " << Handle << ": " << dlerror())
|
|
.str());
|
|
return orc_rt::Error::success();
|
|
}
|
|
|
|
std::vector<void *> hostOSLibraryLookup(void *Handle,
|
|
const std::vector<std::string> &Names) {
|
|
std::vector<void *> Result;
|
|
Result.reserve(Names.size());
|
|
for (const auto &Name : Names)
|
|
Result.push_back(dlsym(Handle, Name.c_str()));
|
|
return Result;
|
|
}
|
|
|
|
} // anonymous namespace
|