Bug 191270: added the ability to load a dynamic shared library (.dylib) on
Mac OS X. Tag: NSPRPUB_PRE_4_2_CLIENT_BRANCH git-svn-id: svn://10.0.0.236/branches/NSPRPUB_PRE_4_2_CLIENT_BRANCH@138247 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
@@ -134,6 +134,7 @@ struct PRLibrary {
|
||||
|
||||
#if defined(XP_MACOSX)
|
||||
CFMutableDictionaryRef wrappers;
|
||||
const struct mach_header* image;
|
||||
#endif /* XP_MACOSX */
|
||||
#endif
|
||||
|
||||
@@ -815,7 +816,10 @@ static PRStatus
|
||||
pr_LoadViaDyld(const char *name, PRLibrary *lm)
|
||||
{
|
||||
lm->dlh = pr_LoadMachDyldModule(name);
|
||||
return (lm->dlh != NULL) ? PR_SUCCESS : PR_FAILURE;
|
||||
if (lm->dlh == NULL) {
|
||||
lm->image = NSAddImage(name, NSADDIMAGE_OPTION_NONE);
|
||||
}
|
||||
return (lm->dlh != NULL || lm->image != NULL) ? PR_SUCCESS : PR_FAILURE;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -1269,7 +1273,7 @@ PR_UnloadLibrary(PRLibrary *lib)
|
||||
#elif defined(USE_HPSHL)
|
||||
result = shl_unload(lib->dlh);
|
||||
#elif defined(USE_MACH_DYLD)
|
||||
result = NSUnLinkModule(lib->dlh, FALSE);
|
||||
result = NSUnLinkModule(lib->dlh, NSUNLINKMODULE_OPTION_NONE);
|
||||
#else
|
||||
#error Configuration error
|
||||
#endif
|
||||
@@ -1293,6 +1297,7 @@ PR_UnloadLibrary(PRLibrary *lib)
|
||||
#if defined(XP_MACOSX)
|
||||
if (lib->wrappers)
|
||||
CFRelease(lib->wrappers);
|
||||
/* No way to unload an image (lib->image) */
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -1410,6 +1415,17 @@ pr_FindSymbolInLib(PRLibrary *lm, const char *name)
|
||||
|
||||
if (f == NULL && strcmp(name + SYM_OFFSET, "main") == 0) f = lm->main;
|
||||
}
|
||||
#if defined(XP_MACOSX)
|
||||
if (lm->image) {
|
||||
NSSymbol symbol;
|
||||
symbol = NSLookupSymbolInImage(lm->image, name,
|
||||
NSLOOKUPSYMBOLINIMAGE_OPTION_BIND);
|
||||
if (symbol != NULL)
|
||||
f = NSAddressOfSymbol(symbol);
|
||||
else
|
||||
f = NULL;
|
||||
}
|
||||
#endif
|
||||
#undef SYM_OFFSET
|
||||
#endif /* XP_MAC */
|
||||
|
||||
|
||||
Reference in New Issue
Block a user