Botan 1.10.17
dyn_load.cpp
Go to the documentation of this file.
1/**
2* Dynamically Loaded Object
3* (C) 2010 Jack Lloyd
4*
5* Distributed under the terms of the Botan license
6*/
7
8#include <botan/internal/dyn_load.h>
9#include <botan/build.h>
10#include <stdexcept>
11
12#if defined(BOTAN_TARGET_OS_HAS_DLOPEN)
13 #include <dlfcn.h>
14#elif defined(BOTAN_TARGET_OS_HAS_LOADLIBRARY)
15 #include <windows.h>
16#endif
17
18namespace Botan {
19
20namespace {
21
22void raise_runtime_loader_exception(const std::string& lib_name,
23 const char* msg)
24 {
25 throw std::runtime_error("Failed to load " + lib_name + ": " +
26 (msg ? msg : "Unknown error"));
27 }
28
29}
30
32 const std::string& library) :
33 lib_name(library), lib(0)
34 {
35#if defined(BOTAN_TARGET_OS_HAS_DLOPEN)
36 lib = ::dlopen(lib_name.c_str(), RTLD_LAZY);
37
38 if(!lib)
39 raise_runtime_loader_exception(lib_name, dlerror());
40
41#elif defined(BOTAN_TARGET_OS_HAS_LOADLIBRARY)
42 lib = ::LoadLibraryA(lib_name.c_str());
43
44 if(!lib)
45 raise_runtime_loader_exception(lib_name, "LoadLibrary failed");
46#endif
47
48 if(!lib)
49 raise_runtime_loader_exception(lib_name, "Dynamic load not supported");
50 }
51
53 {
54#if defined(BOTAN_TARGET_OS_HAS_DLOPEN)
55 ::dlclose(lib);
56#elif defined(BOTAN_TARGET_OS_HAS_LOADLIBRARY)
57 ::FreeLibrary((HMODULE)lib);
58#endif
59 }
60
61void* Dynamically_Loaded_Library::resolve_symbol(const std::string& symbol)
62 {
63 void* addr = 0;
64
65#if defined(BOTAN_TARGET_OS_HAS_DLOPEN)
66 addr = ::dlsym(lib, symbol.c_str());
67#elif defined(BOTAN_TARGET_OS_HAS_LOADLIBRARY)
68 addr = reinterpret_cast<void*>(::GetProcAddress((HMODULE)lib,
69 symbol.c_str()));
70#endif
71
72 if(!addr)
73 throw std::runtime_error("Failed to resolve symbol " + symbol +
74 " in " + lib_name);
75
76 return addr;
77 }
78
79}
Dynamically_Loaded_Library(const std::string &lib_name)
Definition dyn_load.cpp:31
void * resolve_symbol(const std::string &symbol)
Definition dyn_load.cpp:61