X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3ca6a5f04692678cd2d9f3ea0843fc3f5a0b254f..84c5b38d579e140df28cfbb649587e8862148c89:/src/common/dynlib.cpp diff --git a/src/common/dynlib.cpp b/src/common/dynlib.cpp index 3aa8cc8758..5c93399eee 100644 --- a/src/common/dynlib.cpp +++ b/src/common/dynlib.cpp @@ -50,12 +50,23 @@ # define wxDllGetSymbol(handle, modaddr) DosQueryProcAddr(handle, 1L, NULL, (PFN*)modaddr) # define wxDllClose(handle) DosFreeModule(handle) #elif defined(HAVE_DLOPEN) -# define wxDllOpen(lib) dlopen(lib.fn_str(), RTLD_NOW/*RTLD_LAZY*/) -# define wxDllGetSymbol(handle, name) dlsym(handle, name) + // note about dlopen() flags: we use RTLD_NOW to have more Windows-like + // behaviour (Win won't let you load a library with missing symbols) and + // RTLD_GLOBAL because it is needed sometimes and probably doesn't hurt + // otherwise. On True64-Unix RTLD_GLOBAL is not allowed and on VMS the + // second argument on dlopen is ignored. +#ifdef __VMS +# define wxDllOpen(lib) dlopen(lib.fn_str(), 0 ) +#elif defined( __osf__ ) +# define wxDllOpen(lib) dlopen(lib.fn_str(), RTLD_LAZY ) +#else +# define wxDllOpen(lib) dlopen(lib.fn_str(), RTLD_LAZY | RTLD_GLOBAL) +#endif +#define wxDllGetSymbol(handle, name) dlsym(handle, name) # define wxDllClose dlclose #elif defined(HAVE_SHL_LOAD) # define wxDllOpen(lib) shl_load(lib.fn_str(), BIND_DEFERRED, 0) -# define wxDllClose shl_unload +# define wxDllClose shl_unload static inline void *wxDllGetSymbol(shl_t handle, const wxString& name) { @@ -65,6 +76,15 @@ else return (void *)0; } +#elif defined(__APPLE__) && defined(__UNIX__) +void *dlopen(const char *path, int mode /* mode is ignored */); +void *dlsym(void *handle, const char *symbol); +int dlclose(void *handle); +const char *dlerror(void); + +# define wxDllOpen(lib) dlopen(lib.fn_str(), 0) +# define wxDllGetSymbol(handle, name) dlsym(handle, name) +# define wxDllClose dlclose #elif defined(__WINDOWS__) // using LoadLibraryEx under Win32 to avoid name clash with LoadLibrary # ifdef __WIN32__ @@ -78,6 +98,8 @@ # endif // Win32/16 # define wxDllGetSymbol(handle, name) ::GetProcAddress(handle, name) # define wxDllClose ::FreeLibrary +#elif defined(__WXMAC__) +# define wxDllClose(handle) CloseConnection(&handle) #else # error "Don't know how to load shared libraries on this platform." #endif // OS @@ -146,7 +168,7 @@ void wxLibrary::PrepareClasses(wxClassInfo *first) { if (info->m_className) classTable.Put(info->m_className, (wxObject *)info); - info = info->GetNext(); + info = (wxClassInfo *)info->GetNext(); } // Set base pointers for each wxClassInfo @@ -194,10 +216,10 @@ wxDllLoader::GetProgramHandle(void) { #if defined( HAVE_DLOPEN ) && !defined(__EMX__) // optain handle for main program - return dlopen(NULL, RTLD_NOW/*RTLD_LAZY*/); + return dlopen(NULL, RTLD_NOW/*RTLD_LAZY*/); #elif defined (HAVE_SHL_LOAD) // shl_findsymbol with NULL handle looks up in main program - return 0; + return 0; #else wxFAIL_MSG( wxT("This method is not implemented under Windows or OS/2")); return 0; @@ -210,18 +232,18 @@ wxDllLoader::LoadLibrary(const wxString & libname, bool *success) { wxDllType handle; -#if defined(__WXMAC__) +#if defined(__WXMAC__) && !defined(__UNIX__) FSSpec myFSSpec ; Ptr myMainAddr ; Str255 myErrName ; - wxMacPathToFSSpec( libname , &myFSSpec ) ; + wxMacFilename2FSSpec( libname , &myFSSpec ) ; if (GetDiskFragment( &myFSSpec , 0 , kCFragGoesToEOF , "\p" , kPrivateCFragCopy , &handle , &myMainAddr , myErrName ) != noErr ) { p2cstr( myErrName ) ; - wxASSERT_MSG( 1 , (char*)myErrName ) ; - return NULL ; + wxLogSysError( _("Failed to load shared library '%s' Error '%s'") , libname.c_str() , (char*)myErrName ) ; + handle = NULL ; } #elif defined(__WXPM__) || defined(__EMX__) char zError[256] = ""; @@ -283,13 +305,17 @@ wxDllLoader::GetSymbol(wxDllType dllHandle, const wxString &name) { void *symbol = NULL; // return value -#if defined( __WXMAC__ ) +#if defined(__WXMAC__) && !defined(__UNIX__) Ptr symAddress ; CFragSymbolClass symClass ; Str255 symName ; - strcpy( (char*) symName , name ) ; - c2pstr( (char*) symName ) ; +#if TARGET_CARBON + c2pstrcpy( (StringPtr) symName , name ) ; +#else + strcpy( (char *) symName , name ) ; + c2pstr( (char *) symName ) ; +#endif if ( FindSymbol( dllHandle , symName , &symAddress , &symClass ) == noErr ) symbol = (void *)symAddress ; @@ -339,7 +365,7 @@ wxLibrary *wxLibraries::LoadLibrary(const wxString& name) if (node != NULL) return ((wxLibrary *)node->Data()); #else // !OS/2 - if ( (node = m_loaded.Find(name.GetData())) ) + if ( (node = m_loaded.Find(name.GetData())) != NULL) return ((wxLibrary *)node->Data()); #endif // If DLL shares data, this is necessary.