X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ac6b7b3c9175b6d9d26342992c5695edc327fd78..edc536d358374987326d93adb1012b6eda9435a0:/src/unix/dlunix.cpp diff --git a/src/unix/dlunix.cpp b/src/unix/dlunix.cpp index 30fdae4f36..5dc05dd279 100644 --- a/src/unix/dlunix.cpp +++ b/src/unix/dlunix.cpp @@ -33,6 +33,26 @@ #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 +#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 @@ -286,7 +293,7 @@ public: wxDynamicLibraryDetails *details = new wxDynamicLibraryDetails; details->m_path = path; details->m_name = path.AfterLast(_T('/')); - details->m_address = wx_reinterpret_cast(void *, start); + details->m_address = wxUIntToPtr(start); details->m_length = end - start; // try to extract the library version from its name @@ -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];