]> git.saurik.com Git - wxWidgets.git/blobdiff - src/unix/dlunix.cpp
Applied patch [ 1207531 ] Fix for wxCalendarCtrl being UNUSABLE with some languages
[wxWidgets.git] / src / unix / dlunix.cpp
index 30fdae4f36c1ecd7759a63ea705f03af564ea918..08e2f9b0b81aa1332ea41ffc2bd114b17d8701e9 100644 (file)
     #include "wx/log.h"
 #endif
 
+// only Mac OS X 10.3+ has dlfcn.h, and it is simpler to always provide our own
+// wrappers using the native functions instead of doing checks for OS version
+#ifndef __DARWIN__
+    #include <dlfcn.h>
+#endif
+
+// if some flags are not supported, just ignore them
+#ifndef RTLD_LAZY
+    #define RTLD_LAZY 0
+#endif
+
+#ifndef RTLD_NOW
+    #define RTLD_NOW 0
+#endif
+
+#ifndef RTLD_GLOBAL
+    #define RTLD_GLOBAL 0
+#endif
+
+
 #if defined(HAVE_DLOPEN) || defined(__DARWIN__)
     #define USE_POSIX_DL_FUNCS
 #elif !defined(HAVE_SHL_LOAD)
@@ -82,7 +102,7 @@ static
 void TranslateError(const char *path, int number)
 {
     unsigned int index;
-    static char *OFIErrorStrings[] =
+    static const char *OFIErrorStrings[] =
     {
         "%s(%d): Object Image Load Failure\n",
         "%s(%d): Object Image Load Success\n",
@@ -90,7 +110,7 @@ void TranslateError(const char *path, int number)
         "%s(%d): No valid architecture\n",
         "%s(%d): Object image has an invalid format\n",
         "%s(%d): Invalid access (permissions?)\n",
-        "%s(%d): Unknown error code from NSCreateObjectFileImageFromFile\n",
+        "%s(%d): Unknown error code from NSCreateObjectFileImageFromFile\n"
     };
 #define NUM_OFI_ERRORS (sizeof(OFIErrorStrings) / sizeof(OFIErrorStrings[0]))
 
@@ -135,7 +155,7 @@ void *dlopen(const char *path, int WXUNUSED(mode) /* mode is ignored */)
 
 int dlclose(void *handle)
 {
-    NSUnLinkModule( handle, NSUNLINKMODULE_OPTION_NONE);
+    NSUnLinkModule((NSModule)handle, NSUNLINKMODULE_OPTION_NONE);
     return 0;
 }
 
@@ -149,7 +169,7 @@ void *dlsym(void *handle, const char *symbol)
     p[0] = '_';
     strcpy(p + 1, symbol);
 
-    NSSymbol nsSymbol = NSLookupSymbolInModule( handle, p );
+    NSSymbol nsSymbol = NSLookupSymbolInModule((NSModule)handle, p );
     return nsSymbol ? NSAddressOfSymbol(nsSymbol) : NULL;
 }
 
@@ -171,30 +191,17 @@ wxDllType wxDynamicLibrary::GetProgramHandle()
 /* static */
 wxDllType wxDynamicLibrary::RawLoad(const wxString& libname, int flags)
 {
-    wxASSERT_MSG( (flags & wxDL_NOW) == 0,
+    wxASSERT_MSG( !(flags & wxDL_NOW) || !(flags & wxDL_LAZY),
                   _T("wxDL_LAZY and wxDL_NOW are mutually exclusive.") );
 
 #ifdef USE_POSIX_DL_FUNCS
-    int rtldFlags = 0;
+    // we need to use either RTLD_NOW or RTLD_LAZY because if we call dlopen()
+    // with flags == 0 recent versions of glibc just fail the call, so use
+    // RTLD_NOW even if wxDL_NOW was not specified
+    int rtldFlags = flags & wxDL_LAZY ? RTLD_LAZY : RTLD_NOW;
 
-#ifdef RTLD_LAZY
-    if ( flags & wxDL_LAZY )
-    {
-        rtldFlags |= RTLD_LAZY;
-    }
-#endif
-#ifdef RTLD_NOW
-    if ( flags & wxDL_NOW )
-    {
-        rtldFlags |= RTLD_NOW;
-    }
-#endif
-#ifdef RTLD_GLOBAL
     if ( flags & wxDL_GLOBAL )
-    {
         rtldFlags |= RTLD_GLOBAL;
-    }
-#endif
 
     return dlopen(libname.fn_str(), rtldFlags);
 #else // !USE_POSIX_DL_FUNCS
@@ -226,7 +233,7 @@ void wxDynamicLibrary::Unload(wxDllType handle)
     shl_unload(handle);
 #endif // USE_POSIX_DL_FUNCS/!USE_POSIX_DL_FUNCS
 
-#ifdef USE_POSIX_DL_FUNCS
+#if defined(USE_POSIX_DL_FUNCS) && defined(wxHAVE_DYNLIB_ERROR)
     if ( rc != 0 )
         Error();
 #endif
@@ -321,13 +328,13 @@ wxDynamicLibraryDetailsArray wxDynamicLibrary::ListLoaded()
 
 #ifdef __LINUX__
     // examine /proc/self/maps to find out what is loaded in our address space
-    wxFFile file("/proc/self/maps");
+    wxFFile file(_T("/proc/self/maps"));
     if ( file.IsOpened() )
     {
         // details of the module currently being parsed
         wxString pathCur;
-        unsigned long startCur,
-                      endCur;
+        unsigned long startCur = 0,
+                      endCur = 0;
 
         char path[1024];
         char buf[1024];