00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #include "qplatformdefs.h"
00039 #include "private/qlibrary_p.h"
00040
00041 #ifndef QT_NO_LIBRARY
00042
00043 #if defined(QT_AOUT_UNDERSCORE)
00044 #include <string.h>
00045 #endif
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056 #if defined(Q_OS_MAC)
00057
00058 bool QLibraryPrivate::loadLibrary()
00059 {
00060 return FALSE;
00061 }
00062
00063 bool QLibraryPrivate::freeLibrary()
00064 {
00065 return FALSE;
00066 }
00067
00068 void* QLibraryPrivate::resolveSymbol( const char* )
00069 {
00070 return 0;
00071 }
00072
00073 #elif defined(QT_HPUX_LD) // for HP-UX < 11.x and 32 bit
00074
00075 bool QLibraryPrivate::loadLibrary()
00076 {
00077 if ( pHnd )
00078 return TRUE;
00079
00080 QString filename = library->library();
00081
00082 pHnd = (void*)shl_load( filename.latin1(), BIND_DEFERRED | BIND_NONFATAL | DYNAMIC_PATH, 0 );
00083 #if defined(QT_DEBUG) || defined(QT_DEBUG_COMPONENT)
00084 if ( !pHnd )
00085 qWarning( "%s: failed to load library!", filename.latin1() );
00086 #endif
00087 return pHnd != 0;
00088 }
00089
00090 bool QLibraryPrivate::freeLibrary()
00091 {
00092 if ( !pHnd )
00093 return TRUE;
00094
00095 if ( shl_unload( (shl_t)pHnd ) ) {
00096 #if defined(QT_DEBUG) || defined(QT_DEBUG_COMPONENT)
00097 QString filename = library->library();
00098 qWarning( "%s: Failed to unload library!", filename.latin1() );
00099 #endif
00100 return FALSE;
00101 }
00102 pHnd = 0;
00103 return TRUE;
00104 }
00105
00106 void* QLibraryPrivate::resolveSymbol( const char* symbol )
00107 {
00108 if ( !pHnd )
00109 return 0;
00110
00111 void* address = 0;
00112 if ( shl_findsym( (shl_t*)&pHnd, symbol, TYPE_UNDEFINED, &address ) < 0 ) {
00113 #if defined(QT_DEBUG_COMPONENT)
00114 QString filename = library->library();
00115 qWarning( "%s: couldn't resolve symbol \"%s\"", filename.latin1(), symbol );
00116 #endif
00117 }
00118 return address;
00119 }
00120
00121 #else // POSIX
00122 #include <dlfcn.h>
00123
00124 bool QLibraryPrivate::loadLibrary()
00125 {
00126 if ( pHnd )
00127 return TRUE;
00128
00129 QString filename = library->library();
00130
00131 pHnd = dlopen( filename.latin1(), RTLD_LAZY );
00132 #if defined(QT_DEBUG) || defined(QT_DEBUG_COMPONENT)
00133 if ( !pHnd )
00134 qWarning( "%s", dlerror() );
00135 #endif
00136 return pHnd != 0;
00137 }
00138
00139 bool QLibraryPrivate::freeLibrary()
00140 {
00141 if ( !pHnd )
00142 return TRUE;
00143
00144 if ( dlclose( pHnd ) ) {
00145 #if defined(QT_DEBUG) || defined(QT_DEBUG_COMPONENT)
00146 qWarning( "%s", dlerror() );
00147 #endif
00148 return FALSE;
00149 }
00150
00151 pHnd = 0;
00152 return TRUE;
00153 }
00154
00155 void* QLibraryPrivate::resolveSymbol( const char* symbol )
00156 {
00157 if ( !pHnd )
00158 return 0;
00159
00160 #if defined(QT_AOUT_UNDERSCORE)
00161
00162 char* undrscr_symbol = new char[strlen(symbol)+2];
00163 undrscr_symbol[0] = '_';
00164 strcpy(undrscr_symbol+1, symbol);
00165 void* address = dlsym( pHnd, undrscr_symbol );
00166 delete [] undrscr_symbol;
00167 #else
00168 void* address = dlsym( pHnd, symbol );
00169 #endif
00170 #if defined(QT_DEBUG_COMPONENT)
00171 const char* error = dlerror();
00172 if ( error )
00173 qWarning( "%s", error );
00174 #endif
00175 return address;
00176 }
00177
00178 #endif // POSIX
00179
00180 #endif