Changeset 2496 in Sophya for trunk/SophyaLib/SysTools/pdlmgr.cc


Ignore:
Timestamp:
Feb 3, 2004, 12:05:44 PM (22 years ago)
Author:
ansari
Message:

Implementation propre de la gestion de chargement dynamique (classe PDynLinkMgr) sur MacOSX/Darwin a travers les API NSObjectFileImage et NSModule + petite correction ds zthread.h (deplacement de unlock()) - Reza 3 Fevrier 2004

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/SophyaLib/SysTools/pdlmgr.cc

    r2322 r2496  
    172172  cmd = "ld -b -o " + fnameso + " " + fnameobj + " -lm -lc";
    173173#elif defined(Darwin)
    174   cmd = "cc -bundle -flat_namespace -undefined suppress -o " + fnameso + " " + fnameobj + " -lm  -lcc_dynamic -lSystem ";
     174  // cmd = "cc -bundle -flat_namespace -undefined suppress -o " + fnameso + " " + fnameobj + " -lm  -lcc_dynamic -lSystem ";
     175  cmd = "cc -bundle -o " + fnameso + " " + fnameobj + " -lSystem -lm";
    175176#else
    176177  cmd = "ld -o " + fnameso + " " + fnameobj + " -lm -lc";
     
    195196PDynLinkMgr::PDynLinkMgr(string& soname, bool cp)
    196197{
    197 #ifndef Darwin
    198 dlhandle = NULL;
    199 #endif
     198dylok = false;
    200199soName = "";
    201200
     
    230229soName = fnameso;
    231230
     231string sdylerr;
    232232#if defined(HPUX)
    233 dlhandle = NULL;
    234233cerr << "PDynLinkMgr::PDynLinkMgr() Not yet available on HP-UX " << endl;
    235234return;
    236 #else
     235#elif defined(Darwin)
     236NSObjectFileImageReturnCode nsrc = NSCreateObjectFileImageFromFile(fnameso.c_str(), &nsobjfile);
     237if (nsrc == NSObjectFileImageSuccess) {
     238  nsmod = NSLinkModule(nsobjfile, fnameso.c_str(),
     239                       NSLINKMODULE_OPTION_BINDNOW | NSLINKMODULE_OPTION_PRIVATE |
     240                       NSLINKMODULE_OPTION_RETURN_ON_ERROR);
     241  // The second argument of NSLinkModule is the module name
     242  // We might associate later a name for the module in the PDynLinkMgr object
     243  if (nsmod != NULL) dylok = true;
     244  else cerr << "PDynLinkMgr::PDynLinkMgr()/ Error from NSLinkModule ... " << endl;
     245}
     246else {
     247  cerr << "PDynLinkMgr::PDynLinkMgr()/ Error from NSCreateObjectFileImageFromFile ... " << endl;
     248  if (nsrc == NSObjectFileImageFailure) cerr << " ErrCode= NSObjectFileImageFailure " << endl;
     249  else if (nsrc == NSObjectFileImageInappropriateFile) cerr << " ErrCode= NSObjectFileImageInappropriateFile" << endl;
     250  else if (nsrc == NSObjectFileImageArch ) cerr << " ErrCode= NSObjectFileImageArch" << endl;
     251  else if (nsrc == NSObjectFileImageFormat) cerr << " ErrCode= NSObjectFileImageFormat" << endl;
     252  else if (nsrc == NSObjectFileImageAccess) cerr << " ErrCode= NSObjectFileImageAccess" << endl;
     253}
     254#else
     255dlhandle = NULL;
    237256dlhandle =  dlopen(fnameso.c_str(), RTLD_NOW);
    238 if (dlhandle == NULL) {
     257if (dlhandle != NULL) dylok = true;
     258else {
     259  sdylerr = "Loader Error (dlerror()):";
     260  sdylerr += dlerror();
     261#endif
     262
     263if (!dylok)  {
    239264  cerr << "PDynLinkMgr::PDynLinkMgr(): Error opening SO " << fnameso
    240265       << " (" << soname << ")" << endl;
    241   string sn = dlerror();
    242   cerr << "Loader Error (dlerror()) :" << sn << endl;
     266  if (sdylerr.length() > 0) cerr << sdylerr;
    243267  return;
    244268  }
    245 #endif
    246269}
    247270
     
    253276#if defined(HPUX)
    254277cerr << "PDynLinkMgr::~PDynLinkMgr() Not yet available on HP-UX " << endl;
    255 return;
    256 #else
    257 if (dlhandle) dlclose(dlhandle);    dlhandle = NULL;
     278// return;
     279#elif defined(Darwin)
     280if (dylok) {
     281  if (nsmod != NULL)  NSUnLinkModule(nsmod, NSUNLINKMODULE_OPTION_NONE);
     282  NSDestroyObjectFileImage(nsobjfile);
     283  }
     284#else
     285if (dylok) {
     286  if (dlhandle) dlclose(dlhandle);    dlhandle = NULL;
     287  }
     288#endif
    258289if (copy) {
    259290  string cmd = "rm -f " + soName;
    260291  system(cmd.c_str());
    261292  }
    262 #endif
    263293}
    264294
     
    269299{
    270300DlFunction f = NULL;
     301if (!dylok) {
     302  cerr << "PDynLinkMgr::GetFunction() Error:sharedobjet/dynamic library not open -> f=NULL" << endl;
     303  return f;
     304}
    271305#if defined(HPUX)
    272306cerr << "PDynLinkMgr::GetFunction() Not yet available on HP-UX " << endl;
    273307return f;
    274 #else
     308#endif
    275309#if defined(Darwin)
    276310string funame = "_" + funcname;
     311NSSymbol nsf = NSLookupSymbolInModule(nsmod, funame.c_str());
     312f = (DlFunction)NSAddressOfSymbol(nsf);
    277313#else
    278314string const & funame = funcname;
    279 #endif
    280315if (dlhandle != NULL) 
    281316  f = (DlFunction)dlsym(dlhandle, funame.c_str());
     317#endif
     318
    282319if (f == NULL) cerr << "PDynLinkMgr::GetFunction(): Error linking " << funcname << endl;
    283320return(f);
    284 #endif
    285 }
    286 
    287 
     321}
     322
     323
Note: See TracChangeset for help on using the changeset viewer.