dll.c revision 1d75f53dd4d0c5160736ac1d2fe4329e27a5dc84
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 )
1d75f53dd4d0c5160736ac1d2fe4329e27a5dc84vboxsync cwcPath = GetSystemDirectoryW(szwPath, RT_ELEMENTS(szwPath));
1d75f53dd4d0c5160736ac1d2fe4329e27a5dc84vboxsync crError("GetSystemDirectoryW failed err %d", winEr);
1d75f53dd4d0c5160736ac1d2fe4329e27a5dc84vboxsync cwcPath = GetModuleFileNameW(NULL, szwPath, RT_ELEMENTS(szwPath));
1d75f53dd4d0c5160736ac1d2fe4329e27a5dc84vboxsync crError("GetModuleFileNameW failed err %d", winEr);
1d75f53dd4d0c5160736ac1d2fe4329e27a5dc84vboxsync if (!MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, dllname, -1, &szwPath[cwcPath], MAX_PATH - cwcPath))
1d75f53dd4d0c5160736ac1d2fe4329e27a5dc84vboxsync crError("MultiByteToWideChar failed err %d", winEr);
10ca321f3be6e9e0ad484f4684cab6532bea20e2vboxsync# endif // CR_NO_GL_SYSTEM_PATH
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
ad27e1d5e48ca41245120c331cc88b50464813cevboxsync * because we are already freeing all resources and VirtualBox will terminate