void *dlopen(char *filename, int unused) { NSObjectFileImage myImage; NSModule myModule; if (firstLoad) { /* If we are loading our first symbol (huzzah!) we should go ahead * and install link editor error handling! */ NSLinkEditErrorHandlers linkEditorErrorHandlers; linkEditorErrorHandlers.undefined = undefinedErrorHandler; linkEditorErrorHandlers.multiple = multipleErrorHandler; linkEditorErrorHandlers.linkEdit = linkEditErrorHandler; NSInstallLinkEditErrorHandlers(&linkEditorErrorHandlers); firstLoad = FALSE; } myDlError = NSCreateObjectFileImageFromFile(filename, &myImage); if (myDlError != NSObjectFileImageSuccess) return(NULL); myModule = NSLinkModule(myImage, filename, NSLINKMODULE_OPTION_PRIVATE); return((void *)myModule); }
/* ggDarwinDLOpen implements a "dlopen" wrapper */ gg_dlhand ggDarwinDLOpen(const char *filename, int flags) { gg_dlhand ret = NULL; struct gg_dlhand_darwin_t *darwin_ret = NULL; NSLinkEditErrorHandlers error_handlers; const char *pathname, *modulename; darwin_ret = (struct gg_dlhand_darwin_t *)malloc(sizeof(struct gg_dlhand_darwin_t)); if (darwin_ret == NULL) return ret; ret = (void *)darwin_ret; if (flags & GG_MODULE_GLOBAL) { darwin_ret->nsmodule_flags = NSLINKMODULE_OPTION_NONE; } else { darwin_ret->nsmodule_flags = NSLINKMODULE_OPTION_PRIVATE; } /* if */ splitstring(filename, &pathname, &modulename); dlerror_code = NSCreateObjectFileImageFromFile(pathname, &darwin_ret->objectFileImage); ggstrlcpy(dlerror_filename, filename, sizeof(dlerror_filename)); switch (dlerror_code) { case NSObjectFileImageSuccess: break; case NSObjectFileImageFailure: case NSObjectFileImageInappropriateFile: case NSObjectFileImageArch: case NSObjectFileImageFormat: case NSObjectFileImageAccess: goto err0; } /* switch */ /* Install our own error handlers */ error_handlers.undefined = ggDarwinErrorUndefined; error_handlers.multiple = ggDarwinErrorMultiple; error_handlers.linkEdit = ggDarwinErrorLinkEdit; #if 0 /* Let the default handlers do their work * as long as our own error handlers are stubs. */ NSInstallLinkEditErrorHandlers(&error_handlers); #endif /* try to load the module now */ darwin_ret->nsmodule = NSLinkModule(darwin_ret->objectFileImage, modulename, darwin_ret->nsmodule_flags); /* Either we return successful here or the error handlers * already aborted/exited the app before. */ return ret; err0: free(ret); return NULL; } /* ggDarwinDLOpen */
/* Initialize all DSO stuff */ bool dso_init() { NSLinkEditErrorHandlers h; h.undefined = nosymbol; h.multiple = multiple; h.linkEdit = linkedit; NSInstallLinkEditErrorHandlers(&h); return (true); }
static void dlinit(void) { NSInstallLinkEditErrorHandlers(&errorHandlers); }