dll.c revision adb5e7872c1b297262ff6794f8a6ed3e4f026b16
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/* Copyright (c) 2001, Stanford University
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * All rights reserved
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * See the file LICENSE.txt for information on redistributing this software.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#if defined(IRIX) || defined(IRIX64) || defined(Linux) || defined(FreeBSD) || defined(AIX) || defined(DARWIN) || defined(SunOS) || defined(OSF1)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncCFBundleRef LoadFramework( const char *frameworkName ) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* load a system framework */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* XXX \todo should this folder be retrieved from somewhere else? */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStrcpy( fullfile, "/System/Library/Frameworks/" );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* load any framework */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync bundleURL = CFURLCreateWithString( NULL, CFStringCreateWithCStringNoCopy(NULL, fullfile, CFStringGetSystemEncoding(), NULL), NULL );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync __frameworkErr = "Could not create OpenGL Framework bundle URL";
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync bundle = CFBundleCreate( kCFAllocatorDefault, bundleURL );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync __frameworkErr = "Could not create OpenGL Framework bundle";
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync __frameworkErr = "Could not load MachO executable";
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* default to a chromium bundle */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync switch( NSCreateObjectFileImageFromFile(_filename, &fileImage) ) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync __bundleErr = "NSObjectFileImageFailure: Failure.";
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync __bundleErr = "NSObjectFileImageInappropriateFile: The specified file is not of a valid type.";
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync __bundleErr = "NSObjectFileImageArch: The specified file is for a different CPU architecture.";
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync __bundleErr = "NSObjectFileImageFormat: The specified file does not appear to be a Mach-O file";
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync __bundleErr = "NSObjectFileImageAccess: Permission to create image denied.";
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync const char *name;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync NSLinkEditError(&c, &n, &name, (const char**)&__bundleErr);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncint check_extension( const char *name, const char *extension ) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Open the named shared library.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * If resolveGlobal is non-zero, unresolved symbols can be satisfied by
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * any matching symbol already defined globally. Otherwise, if resolveGlobal
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * is zero, unresolved symbols should be resolved using symbols in that
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * object (in preference to global symbols).
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * NOTE: this came about because we found that for libGL, we need the
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * global-resolve option but for SPU's we need the non-global option (consider
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * the state tracker duplicated in the array, tilesort, etc. SPUs).
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncCRDLL *crDLLOpen( const char *dllname, int resolveGlobal )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* XXX \todo Get better error handling in here */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync dll->hinstLib = (void*)NSAddImage( dllname, NSADDIMAGE_OPTION_RETURN_ON_ERROR );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync dll->hinstLib = dlopen( dllname, RTLD_LAZY | RTLD_GLOBAL );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync dll->hinstLib = dlopen( dllname, RTLD_LAZY | RTLD_LOCAL );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#elif defined(IRIX) || defined(IRIX64) || defined(Linux) || defined(FreeBSD) || defined(AIX) || defined(SunOS) || defined(OSF1)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync dll->hinstLib = dlopen( dllname, RTLD_LAZY | RTLD_GLOBAL );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crError( "DLL Loader couldn't find/open %s", dllname );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncCRDLLFunc crDLLGetNoError( CRDLL *dll, const char *symname )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return (CRDLLFunc) GetProcAddress( dll->hinstLib, symname );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return (CRDLLFunc) CFBundleGetFunctionPointerForName( (CFBundleRef) dll->hinstLib, CFStringCreateWithCStringNoCopy(NULL, symname, CFStringGetSystemEncoding(), NULL) );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync nssym = NSLookupSymbolInImage( dll->hinstLib, symname, NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return (CRDLLFunc) dlsym( dll->hinstLib, symname );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync nssym = NSLookupSymbolInModule( dll->hinstLib, symname );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync nssym = NSLookupSymbolInImage( dll->hinstLib, name, NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync nssym = NSLookupSymbolInModule( dll->hinstLib, name );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#elif defined(IRIX) || defined(IRIX64) || defined(Linux) || defined(FreeBSD) || defined(AIX) || defined(SunOS) || defined(OSF1)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return (CRDLLFunc) dlsym( dll->hinstLib, symname );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncCRDLLFunc crDLLGet( CRDLL *dll, const char *symname )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Are you sure there isn't some C++ mangling messing you up? */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crWarning( "Couldn't get symbol \"%s\" in \"%s\"", symname, dll->name );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (!dll) return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#elif defined(IRIX) || defined(IRIX64) || defined(Linux) || defined(FreeBSD) || defined(AIX) || defined(SunOS) || defined(OSF1)
4a65f82711f244289aed99b7bb0cc7e01b0ebcecvboxsync * Unloading Nvidia's libGL will crash VirtualBox later during shutdown.
4a65f82711f244289aed99b7bb0cc7e01b0ebcecvboxsync * Therefore we will skip unloading it. It will be unloaded later anway
4a65f82711f244289aed99b7bb0cc7e01b0ebcecvboxsync * because we are already freeing all ressources and VirtualBox will terminate