소스 검색

First Pass(for me at least) at osx dynamic loader..

Roger Hughston 20 년 전
부모
커밋
ad0cbe08b2
2개의 변경된 파일31개의 추가작업 그리고 37개의 파일을 삭제
  1. 16 0
      dtool/src/dtoolutil/filename.cxx
  2. 15 37
      dtool/src/dtoolutil/load_dso.cxx

+ 16 - 0
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:

+ 15 - 37
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 <mach-o/dyld.h>
+#include <dlfcn.h>
 
-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