open_toontown_panda3d/dtool/src/dtoolutil/load_dso.cxx

147 lines
3.6 KiB
C++

// Filename: load_dso.cxx
// Created by: drose (12May00)
//
////////////////////////////////////////////////////////////////////
//
// PANDA 3D SOFTWARE
// Copyright (c) 2001, Disney Enterprises, Inc. All rights reserved
//
// All use of this software is subject to the terms of the Panda 3d
// Software license. You should have received a copy of this license
// along with this source code; you will also find a current copy of
// the license at http://www.panda3d.org/license.txt .
//
// To contact the maintainers of this program write to
// panda3d@yahoogroups.com .
//
////////////////////////////////////////////////////////////////////
#include "load_dso.h"
#if defined(PENV_PS2)
// The playstation2 can't do any of this stuff, so these functions are B O G U S
void *
load_dso(const Filename &)
{
return (void *) NULL;
}
string
load_dso_error()
{
ostringstream ps2errmsg;
ps2errmsg << "load_dso_error() unsupported on PS2. (CSN)";
return ps2errmsg.str();
}
#else
#if defined(WIN32)
/* begin Win32-specific code */
#define WINDOWS_LEAN_AND_MEAN
#include <windows.h>
#undef WINDOWS_LEAN_AND_MEAN
void *
load_dso(const Filename &filename) {
string os_specific = filename.to_os_specific();
return LoadLibrary(os_specific.c_str());
}
string
load_dso_error() {
DWORD last_error = GetLastError();
switch (last_error) {
case 2: return "File not found";
case 3: return "Path not found";
case 4: return "Too many open files";
case 5: return "Access denied";
case 14: return "Out of memory";
case 18: return "No more files";
case 126: return "Module not found";
case 998: return "Invalid access to memory location";
}
// Some unknown error code.
ostringstream errmsg;
errmsg << "Unknown error " << last_error;
return errmsg.str();
}
/* end Win32-specific code */
#elif defined(PENV_OSX)
/* begin Mac OS X code */
#include <mach-o/dyld.h>
void *
load_dso(const Filename &filename) {
enum DYLD_BOOL result;
cerr << "_dyld_present() = " << _dyld_present() << endl;
cerr << "_dyld_image_count() = " << _dyld_image_count() << endl;
string os_specific = filename.to_os_specific();
result = NSAddLibrary(os_specific().c_str());
if (result == FALSE) {
cerr << "Failed to load '" << filename << "'" << endl;
}
// need to reference a symbol in the lib in order for static init to happen
// need to figure out how to do this
cerr << "_dyld_present() = " << _dyld_present() << endl;
cerr << "_dyld_image_count() = " << _dyld_image_count() << endl;
for (unsigned long i=0; i<_dyld_image_count(); ++i)
cerr << "_dyld_get_image_name(" << i << ") = '" << _dyld_get_image_name(i)
<< "'" << endl;
string stmp = filename;
cerr << "filename = '" << filename << "'" << endl;
int i = stmp.rfind(".dylib");
stmp.erase(i, i+6);
stmp += "_so";
cerr << "filename with tail patched = '" << stmp << "'" << endl;
i = stmp.rfind("lib");
if (i != 0) {
if (stmp[i-1] != '/')
i = stmp.rfind("lib", i-1);
stmp.erase(0, i);
}
cerr << "final patched filename = '" << stmp << "'" << endl;
stmp = "___" + stmp + "_find_me__";
cerr << "symbol name searching for = '" << stmp << "'" << endl;
unsigned long foo1;
void *foo2;
_dyld_lookup_and_bind(stmp.c_str(), &foo1, &foo2);
char *foo3 = (char*)foo1;
cerr << "symbol value = '" << foo3 << "'" << endl;
return (void*)0L;
}
string
load_dso_error() {
return "No DSO loading yet!";
}
#else
/* begin generic code */
#include <dlfcn.h>
void *
load_dso(const Filename &filename) {
string os_specific = filename.to_os_specific();
return dlopen(os_specific.c_str(), RTLD_NOW);
}
string
load_dso_error() {
return dlerror();
}
#endif
#endif // PS2