Version: 9.16.0
DynLibLoaderGNU.cxx
Go to the documentation of this file.
1// Copyright (C) 2006-2026 CEA, EDF
2//
3// This library is free software; you can redistribute it and/or
4// modify it under the terms of the GNU Lesser General Public
5// License as published by the Free Software Foundation; either
6// version 2.1 of the License, or (at your option) any later version.
7//
8// This library is distributed in the hope that it will be useful,
9// but WITHOUT ANY WARRANTY; without even the implied warranty of
10// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11// Lesser General Public License for more details.
12//
13// You should have received a copy of the GNU Lesser General Public
14// License along with this library; if not, write to the Free Software
15// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16//
17// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18//
19
20#include "DynLibLoaderGNU.hxx"
21#include <iostream>
22#include <dlfcn.h>
23#include "Exception.hxx"
24
25using namespace YACS::BASES;
26
27#if defined(__APPLE__)
28const char DynLibLoaderGNU::_extForDynLib[]=".dylib";
29#else
30const char DynLibLoaderGNU::_extForDynLib[]=".so";
31#endif
32
33DynLibLoaderGNU::DynLibLoaderGNU(const std::string& libNameWithoutExtension):_libName(libNameWithoutExtension),
34 _handleOnLoadedLib(0)
35{
36}
37
39{
41 dlclose(_handleOnLoadedLib);
42}
43
45{
46 return true;
47}
48
50{
51 return _libName;
52}
53
60int DynLibLoaderGNU::appendDirInSearchPath(const std::string& dirName)
61{
62 return 0;
63}
64
71int DynLibLoaderGNU::removeDirInSearchPath(const std::string& dirName)
72{
73 return 0;
74}
75
76void *DynLibLoaderGNU::getHandleOnSymbolWithName(const std::string& symbName, bool stopOnError)
77{
80 {
81 std::cerr << "Dynamic library with name " << symbName << _extForDynLib;
82 std::cerr << " not existing in paths specified" << std::endl;
83 return 0;
84 }
85 else
86 loadLib();
87 return resolveSymb(symbName, stopOnError);
88}
89
91{
92 std::string fullLibName(_libName);
93 fullLibName+=_extForDynLib;
94 dlerror();
95 _handleOnLoadedLib=dlopen(fullLibName.c_str(),RTLD_LAZY | RTLD_GLOBAL);
96 char *message=dlerror();
97 if (message != NULL)
98 {
99 std::string error = "Error while trying to load library with name " + fullLibName +
100 " with the following internal message: " + message;
101 throw YACS::Exception(error);
102 }
103 return _handleOnLoadedLib != NULL;
104}
105
107{
109 {
110 dlclose(_handleOnLoadedLib);
111 _handleOnLoadedLib = NULL;
112 }
113 return false;
114}
115
117{
118 unload();
119 return load();
120}
121
122void *DynLibLoaderGNU::resolveSymb(const std::string& symbName, bool stopOnError)
123{
124 dlerror();
125 void *ret=dlsym(_handleOnLoadedLib,symbName.c_str());
126 char *message=dlerror();
127 if(stopOnError && (NULL != message))
128 {
129 std::string error="Error detected on symbol ";
130 error=error+symbName +" search in library with name "+_libName+_extForDynLib+" with the following internal message "+message;
131 throw YACS::Exception(error);
132 }
133 else
134 return ret;
135}
136
138{
139 return _extForDynLib+1;
140}
141
int appendDirInSearchPath(const std::string &dirName)
std::string getLibNameWithoutExt() const
int removeDirInSearchPath(const std::string &dirName)
void * resolveSymb(const std::string &symbName, bool stopOnError)
load lib without regarding that _libName is reachable
void * getHandleOnSymbolWithName(const std::string &symbName, bool stopOnError=true)
static const char * getExtensionForDynLib()
static const char _extForDynLib[]