X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/42a245230195164b903533b72e5c809d14a7c858..5767e836997b965b9d936f1d65244bb886c39025:/src/common/dynlib.cpp diff --git a/src/common/dynlib.cpp b/src/common/dynlib.cpp index ec3c142570..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; } @@ -129,8 +135,12 @@ void *dlsym(void *handle, const char *symbol) // as on many other systems, C symbols have prepended underscores under // Darwin but unlike the normal dlopen(), NSLookupSymbolInModule() is not // aware of this - NSSymbol nsSymbol = NSLookupSymbolInModule( handle, - wxString(_T('_')) + symbol ); + 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; } @@ -314,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); @@ -360,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__) @@ -376,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,