dll.c revision 77d148a232adce564790a3b451f1895ff9c99634
/* Copyright (c) 2001, Stanford University
* All rights reserved
*
* See the file LICENSE.txt for information on redistributing this software.
*/
#include "cr_mem.h"
#include "cr_error.h"
#include "cr_dll.h"
#include "cr_string.h"
#include "stdio.h"
#ifndef IN_GUEST
#include <string.h>
#endif
#if defined(IRIX) || defined(IRIX64) || defined(Linux) || defined(FreeBSD) || defined(AIX) || defined(DARWIN) || defined(SunOS) || defined(OSF1)
#include <dlfcn.h>
#endif
#ifdef DARWIN
char *__frameworkErr=NULL;
char fullfile[8096];
if( frameworkName[0] != '/' ) {
/* load a system framework */
/* XXX \todo should this folder be retrieved from somewhere else? */
} else {
/* load any framework */
}
bundleURL = CFURLCreateWithString( NULL, CFStringCreateWithCStringNoCopy(NULL, fullfile, CFStringGetSystemEncoding(), NULL), NULL );
if( !bundleURL ) {
__frameworkErr = "Could not create OpenGL Framework bundle URL";
return NULL;
}
if( !bundle ) {
__frameworkErr = "Could not create OpenGL Framework bundle";
return NULL;
}
if( !CFBundleLoadExecutable(bundle) ) {
__frameworkErr = "Could not load MachO executable";
return NULL;
}
return bundle;
}
char *__bundleErr=NULL;
void *LoadBundle( const char *filename ) {
__bundleErr = NULL;
if( filename[0] != '/' ) {
/* default to a chromium bundle */
} else {
}
default:
case NSObjectFileImageFailure:
__bundleErr = "NSObjectFileImageFailure: Failure.";
break;
__bundleErr = "NSObjectFileImageInappropriateFile: The specified file is not of a valid type.";
break;
case NSObjectFileImageArch:
__bundleErr = "NSObjectFileImageArch: The specified file is for a different CPU architecture.";
break;
case NSObjectFileImageFormat:
__bundleErr = "NSObjectFileImageFormat: The specified file does not appear to be a Mach-O file";
break;
case NSObjectFileImageAccess:
__bundleErr = "NSObjectFileImageAccess: Permission to create image denied.";
break;
case NSObjectFileImageSuccess:
if( !handle ) {
int n;
const char *name;
}
break;
}
return handle;
}
}
enum {
};
#define NS_ADD 0
int get_dll_type( const char *name ) {
return CR_DLL_FRAMEWORK;
return CR_DLL_BUNDLE;
return CR_DLL_DYLIB;
return CR_DLL_DYLIB;
}
#endif
/*
* Open the named shared library.
* If resolveGlobal is non-zero, unresolved symbols can be satisfied by
* any matching symbol already defined globally. Otherwise, if resolveGlobal
* is zero, unresolved symbols should be resolved using symbols in that
* object (in preference to global symbols).
* NOTE: this came about because we found that for libGL, we need the
* global-resolve option but for SPU's we need the non-global option (consider
* the state tracker duplicated in the array, tilesort, etc. SPUs).
*/
{
char *dll_err;
#if defined(WINDOWS)
(void) resolveGlobal;
/* XXX \todo Get better error handling in here */
case CR_DLL_FRAMEWORK:
break;
case CR_DLL_BUNDLE:
break;
case CR_DLL_DYLIB:
#if NS_ADD
#else
if( resolveGlobal )
else
#endif
break;
default:
dll_err = "Unknown DLL type";
break;
};
#elif defined(IRIX) || defined(IRIX64) || defined(Linux) || defined(FreeBSD) || defined(AIX) || defined(SunOS) || defined(OSF1)
if (resolveGlobal)
else
#else
#endif
{
if (dll_err)
{
}
}
return dll;
}
{
#if defined(WINDOWS)
return (CRDLLFunc) CFBundleGetFunctionPointerForName( (CFBundleRef) dll->hinstLib, CFStringCreateWithCStringNoCopy(NULL, symname, CFStringGetSystemEncoding(), NULL) );
#if NS_ADD
nssym = NSLookupSymbolInImage( dll->hinstLib, symname, NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR );
#else
#endif
else
if( !nssym ) {
else
}
#elif defined(IRIX) || defined(IRIX64) || defined(Linux) || defined(FreeBSD) || defined(AIX) || defined(SunOS) || defined(OSF1)
#else
#endif
}
{
if (!data)
{
/* Are you sure there isn't some C++ mangling messing you up? */
}
return data;
}
{
int dll_err = 0;
if (!dll) return;
#if defined(WINDOWS)
case CR_DLL_FRAMEWORK:
break;
case CR_DLL_DYLIB:
#if !NS_ADD
#endif
break;
case CR_DLL_BUNDLE:
break;
}
#elif defined(IRIX) || defined(IRIX64) || defined(Linux) || defined(FreeBSD) || defined(AIX) || defined(SunOS) || defined(OSF1)
#ifndef IN_GUEST
#endif
#else
#endif
if (dll_err)
}