8#include <botan/internal/dyn_load.h>
10#include <botan/exceptn.h>
11#include <botan/internal/fmt.h>
12#include <botan/internal/target_info.h>
15#if defined(BOTAN_TARGET_OS_HAS_POSIX1)
17#elif defined(BOTAN_TARGET_OS_HAS_WIN32)
27[[noreturn]]
void raise_runtime_loader_exception(std::string_view lib_name,
const char* msg) {
28 std::ostringstream err;
29 err <<
"Failed to load " << lib_name <<
": ";
33 err <<
"Unknown error";
39void* open_shared_library(
const std::string& library) {
40#if defined(BOTAN_TARGET_OS_HAS_POSIX1)
41 void* lib = ::dlopen(library.c_str(), RTLD_LAZY);
46 raise_runtime_loader_exception(library, ::dlerror());
49#elif defined(BOTAN_TARGET_OS_HAS_WIN32)
50 void* lib = ::LoadLibraryA(library.c_str());
55 raise_runtime_loader_exception(library,
"LoadLibrary failed");
58 raise_runtime_loader_exception(library,
"Dynamic loading not supported");
65 m_lib_name(library), m_lib(open_shared_library(m_lib_name)) {}
68#if defined(BOTAN_TARGET_OS_HAS_POSIX1)
70#elif defined(BOTAN_TARGET_OS_HAS_WIN32)
71 ::FreeLibrary(
reinterpret_cast<HMODULE
>(m_lib));
78#if defined(BOTAN_TARGET_OS_HAS_POSIX1)
79 addr = ::dlsym(m_lib, symbol.c_str());
80#elif defined(BOTAN_TARGET_OS_HAS_WIN32)
81 addr =
reinterpret_cast<void*
>(::GetProcAddress(
reinterpret_cast<HMODULE
>(m_lib), symbol.c_str()));
Dynamically_Loaded_Library(std::string_view lib_name)
void * resolve_symbol(const std::string &symbol)
~Dynamically_Loaded_Library()
std::string fmt(std::string_view format, const T &... args)