X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/fb44fc34e84aa9338d159bb3e2485f8647b78e60..142b15c5a1c54540de52a72f3059fdffaa1c8afe:/src/common/dynlib.cpp diff --git a/src/common/dynlib.cpp b/src/common/dynlib.cpp index 32019ad7e7..c2adec7818 100644 --- a/src/common/dynlib.cpp +++ b/src/common/dynlib.cpp @@ -99,22 +99,28 @@ const char *dlerror() void *dlopen(const char *path, int WXUNUSED(mode) /* mode is ignored */) { - int dyld_result; NSObjectFileImage ofile; NSModule handle = NULL; - dyld_result = NSCreateObjectFileImageFromFile(path, &ofile); - if (dyld_result != NSObjectFileImageSuccess) + int dyld_result = NSCreateObjectFileImageFromFile(path, &ofile); + if ( dyld_result != NSObjectFileImageSuccess ) { - TranslateError(path, dyld_result); + handle = NULL; } else { - // NSLinkModule will cause the run to abort on any link error's - // not very friendly but the error recovery functionality is limited. - handle = NSLinkModule(ofile, path, NSLINKMODULE_OPTION_BINDNOW); + handle = NSLinkModule + ( + ofile, + path, + NSLINKMODULE_OPTION_BINDNOW | + NSLINKMODULE_OPTION_RETURN_ON_ERROR + ); } + if ( !handle ) + TranslateError(path, dyld_result); + return handle; } @@ -126,19 +132,16 @@ int dlclose(void *handle) void *dlsym(void *handle, const char *symbol) { - void *addr; - - NSSymbol nsSymbol = NSLookupSymbolInModule( handle , symbol ) ; - - if ( nsSymbol) - { - addr = NSAddressOfSymbol(nsSymbol); - } - else - { - addr = NULL; - } - return addr; + // as on many other systems, C symbols have prepended underscores under + // Darwin but unlike the normal dlopen(), NSLookupSymbolInModule() is not + // aware of this + wxCharBuffer buf(strlen(symbol) + 1); + char *p = buf.data(); + p[0] = '_'; + strcpy(p + 1, symbol); + + NSSymbol nsSymbol = NSLookupSymbolInModule( handle, p ); + return nsSymbol ? NSAddressOfSymbol(nsSymbol) : NULL; } #endif // defined(__DARWIN__) @@ -159,7 +162,7 @@ void *dlsym(void *handle, const char *symbol) #if defined(__HPUX__) const wxChar *wxDynamicLibrary::ms_dllext = _T(".sl"); #elif defined(__DARWIN__) - const wxChar *wxDynamicLibrary::ms_dllext = _T(".dylib"); + const wxChar *wxDynamicLibrary::ms_dllext = _T(".bundle"); #else const wxChar *wxDynamicLibrary::ms_dllext = _T(".so"); #endif @@ -321,12 +324,11 @@ void wxDynamicLibrary::Unload(wxDllType handle) #endif } -void *wxDynamicLibrary::GetSymbol(const wxString &name, bool *success) const +void *wxDynamicLibrary::DoGetSymbol(const wxString &name, bool *success) const { wxCHECK_MSG( IsLoaded(), NULL, _T("Can't load symbol from unloaded library") ); - bool failed = FALSE; void *symbol = 0; wxUnusedVar(symbol); @@ -367,6 +369,15 @@ void *wxDynamicLibrary::GetSymbol(const wxString &name, bool *success) const #error "runtime shared lib support not implemented" #endif + if ( success ) + *success = symbol != NULL; + + return symbol; +} + +void *wxDynamicLibrary::GetSymbol(const wxString& name, bool *success) const +{ + void *symbol = DoGetSymbol(name, success); if ( !symbol ) { #if defined(HAVE_DLERROR) && !defined(__EMX__) @@ -383,18 +394,14 @@ void *wxDynamicLibrary::GetSymbol(const wxString &name, bool *success) const wxLogError(wxT("%s"), err); } #else - failed = TRUE; wxLogSysError(_("Couldn't find symbol '%s' in a dynamic library"), name.c_str()); #endif } - if( success ) - *success = !failed; return symbol; } - /*static*/ wxString wxDynamicLibrary::CanonicalizeName(const wxString& name,