1 // Copyright 2009-2021 Intel Corporation
2 // SPDX-License-Identifier: Apache-2.0
3 
4 #include "library.h"
5 #include "sysinfo.h"
6 #include "filename.h"
7 
8 ////////////////////////////////////////////////////////////////////////////////
9 /// Windows Platform
10 ////////////////////////////////////////////////////////////////////////////////
11 
12 #if defined(__WIN32__)
13 
14 #define WIN32_LEAN_AND_MEAN
15 #include <windows.h>
16 
17 namespace embree
18 {
19   /* opens a shared library */
openLibrary(const std::string & file)20   lib_t openLibrary(const std::string& file)
21   {
22     std::string fullName = file+".dll";
23     FileName executable = getExecutableFileName();
24     HANDLE handle = LoadLibrary((executable.path() + fullName).c_str());
25     return lib_t(handle);
26   }
27 
28   /* returns address of a symbol from the library */
getSymbol(lib_t lib,const std::string & sym)29   void* getSymbol(lib_t lib, const std::string& sym) {
30     return (void*)GetProcAddress(HMODULE(lib),sym.c_str());
31   }
32 
33   /* closes the shared library */
closeLibrary(lib_t lib)34   void closeLibrary(lib_t lib) {
35     FreeLibrary(HMODULE(lib));
36   }
37 }
38 #endif
39 
40 ////////////////////////////////////////////////////////////////////////////////
41 /// Unix Platform
42 ////////////////////////////////////////////////////////////////////////////////
43 
44 #if defined(__UNIX__)
45 
46 #include <dlfcn.h>
47 
48 namespace embree
49 {
50   /* opens a shared library */
openLibrary(const std::string & file)51   lib_t openLibrary(const std::string& file)
52   {
53 #if defined(__MACOSX__)
54     std::string fullName = "lib"+file+".dylib";
55 #else
56     std::string fullName = "lib"+file+".so";
57 #endif
58     void* lib = dlopen(fullName.c_str(), RTLD_NOW);
59     if (lib) return lib_t(lib);
60     FileName executable = getExecutableFileName();
61     lib = dlopen((executable.path() + fullName).c_str(),RTLD_NOW);
62     if (lib == nullptr) {
63       const char* error = dlerror();
64       if (error) {
65         THROW_RUNTIME_ERROR(error);
66       } else {
67         THROW_RUNTIME_ERROR("could not load library "+executable.str());
68       }
69     }
70     return lib_t(lib);
71   }
72 
73   /* returns address of a symbol from the library */
getSymbol(lib_t lib,const std::string & sym)74   void* getSymbol(lib_t lib, const std::string& sym) {
75     return dlsym(lib,sym.c_str());
76   }
77 
78   /* closes the shared library */
closeLibrary(lib_t lib)79   void closeLibrary(lib_t lib) {
80     dlclose(lib);
81   }
82 }
83 #endif
84