38 #include "blocxx/BLOCXX_config.h"
39 #if defined(BLOCXX_USE_DL)
46 #ifdef BLOCXX_HAVE_FCNTL_H
53 #if defined(BLOCXX_USE_FAKE_LIBS)
59 #define BLOCXX_FAKELIB_HEADING "FAKE"
60 #define BLOCXX_FAKELIB_HEADING_LENGTH 4
66 namespace BLOCXX_NAMESPACE
70 bool dlSharedLibrary::s_call_dlclose =
true;
74 dlSharedLibrary::dlSharedLibrary(
void * libhandle,
const String& libName)
75 : SharedLibrary(), m_libhandle( libhandle ), m_libName(libName)
77 #if defined(BLOCXX_USE_FAKE_LIBS)
79 m_fakeLibrary = dlSharedLibrary::isFakeLibrary(libName);
83 initializeSymbolMap();
88 dlSharedLibrary::~dlSharedLibrary()
90 #if !defined(BLOCXX_VALGRIND_SUPPORT) // dlclose()ing shared libs make it impossible to see where memory leaks occurred with valgrind.
93 dlclose( m_libhandle );
97 bool dlSharedLibrary::doGetFunctionPointer(
const String& functionName,
100 MutexLock l(dlSharedLibrary_guard);
101 #if defined(BLOCXX_USE_FAKE_LIBS)
102 String realFunctionName = functionName;
108 if ( symIter == m_symbolMap.end() )
112 realFunctionName = symIter->second;
114 *fp = dlsym( m_libhandle, realFunctionName.c_str() );
116 *fp = dlsym( m_libhandle, functionName.c_str() );
126 bool dlSharedLibrary::isFakeLibrary(
const String& library_path)
129 #if defined(BLOCXX_USE_FAKE_LIBS)
134 int libfd = open(library_path.c_str(), O_RDONLY);
138 char buffer[(BLOCXX_FAKELIB_HEADING_LENGTH) + 1];
139 size_t num_read =
read(libfd, buffer,(BLOCXX_FAKELIB_HEADING_LENGTH));
140 if ( num_read == (BLOCXX_FAKELIB_HEADING_LENGTH) )
143 buffer[BLOCXX_FAKELIB_HEADING_LENGTH] =
'\0';
144 if ( String(BLOCXX_FAKELIB_HEADING) == buffer )
157 #if defined(BLOCXX_USE_FAKE_LIBS)
158 void dlSharedLibrary::initializeSymbolMap()
160 if ( ! m_fakeLibrary )
169 for ( StringArray::const_iterator iter = lines.begin();
174 if ( iter->startsWith(
'#') )
180 if ( current_line.size() != 2 )
185 String option = String(current_line[0]).trim();
186 String value = String(current_line[1]).trim();
187 m_symbolMap[option] = value;