From ad0cbe08b2ec3daaa7393d13d83078a7893e3a5a Mon Sep 17 00:00:00 2001 From: Roger Hughston Date: Fri, 17 Feb 2006 01:28:28 +0000 Subject: [PATCH] First Pass(for me at least) at osx dynamic loader.. --- dtool/src/dtoolutil/filename.cxx | 16 ++++++++++ dtool/src/dtoolutil/load_dso.cxx | 52 +++++++++----------------------- 2 files changed, 31 insertions(+), 37 deletions(-) diff --git a/dtool/src/dtoolutil/filename.cxx b/dtool/src/dtoolutil/filename.cxx index 61829f9d00..0ef9a74c53 100644 --- a/dtool/src/dtoolutil/filename.cxx +++ b/dtool/src/dtoolutil/filename.cxx @@ -911,6 +911,22 @@ to_os_specific() const { Filename standard(*this); standard.standardize(); +#ifdef IS_OSX + if(get_type() == T_dso) + { + std::string workname = standard.get_fullpath(); + size_t dot = workname.rfind('.'); + if (dot != string::npos) + { + if (workname.substr(dot) == ".so") + { + string dyLibBase = workname.substr(0, dot)+".dylib"; + return dyLibBase ; + } + } + } +#endif + #ifdef WIN32 switch (get_type()) { case T_dso: diff --git a/dtool/src/dtoolutil/load_dso.cxx b/dtool/src/dtoolutil/load_dso.cxx index e9d83769cf..8f0d0804b2 100644 --- a/dtool/src/dtoolutil/load_dso.cxx +++ b/dtool/src/dtoolutil/load_dso.cxx @@ -107,49 +107,27 @@ load_dso_error() { /* end Win32-specific code */ -#elif defined(PENV_OSX) +#elif defined(IS_OSX) /* begin Mac OS X code */ #include +#include -void * -load_dso(const Filename &filename) { - enum DYLD_BOOL result; - cerr << "_dyld_present() = " << _dyld_present() << endl; +void * load_dso(const Filename &filename) +{ + 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; + + std::string fname = filename.to_os_specific(); + printf("----- Trying To Load %s \n",fname.c_str()); + + void * answer = dlopen(fname.c_str(),RTLD_NOW| RTLD_LOCAL); + 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; + + + return answer; + } string