Re: [ROOT] UnixDynFindSymbol

From: Fons Rademakers (Fons.Rademakers@cern.ch)
Date: Mon Apr 30 2001 - 18:20:39 MEST


Hi Eddy,

  this is implemented via CINT. Look in TUnixSystem::DynFindSymbol() which
calls back the base class version TSystem::DynFindSymbol() which calls
G__findsym().

Groetjes, Fons.



Eddy Offermann wrote:
> 
> Hi Fons and Rene,
> 
> I notice that UnixDynFindSymbol is only defined for HPUX. Any particular
> reason ?? Maybe one could use dlopen, ...dlsym etc
> 
> Looking at the man page for dlsym:
> 
>      Example 1: Using dlopen() and dlsym() to access  a  function
>      or data objects.
> 
>      The following example shows how one can  use   dlopen()  and
>      dlsym() to access either function or data objects.  For sim-
>      plicity, error checking has been omitted.
> 
>      void       *handle;
>      int        *iptr, (*fptr)(int);
> 
>      /* open the needed object */
>      handle = dlopen("/usr/home/me/libfoo.so.1", RTLD_LAZY);
> 
>      /* find the address of function and data objects */
>      fptr = (int (*)(int))dlsym(handle, "my_function");
>      iptr = (int *)dlsym(handle, "my_object");
> 
>      /* invoke function, passing value of integer as a parameter */
>      (*fptr)(*iptr);
> 
>      Example 2: Using dlsym() to verify that a  particular  func-
>      tion is defined.
> 
>      The following code fragment shows how dlsym() can be used to
>      verify  that a particular function is defined and to call it
>      only if it is.
> 
>      int (*fptr)();
> 
>      if ((fptr = (int (*)())dlsym(RTLD_DEFAULT,
>          "my_function")) != NULL) {
>              (*fptr)();
>      }
> 
> Eddy
> 
> /______________________________________________________________________________
> Func_t TUnixSystem::UnixDynFindSymbol(const char *lib, const char *entry)
> {
>    // Finds and returns a function pointer to a symbol in the shared library.
>    // Returns 0 when symbol not found.
> 
> #if defined(R__HPUX) && !defined(R__GNU)
>    shl_t handle;
> 
>    if (handle = (shl_t)FindDynLib(lib)) {
>       Func_t addr = 0;
>       if (shl_findsym(&handle, entry, TYPE_PROCEDURE, addr) == -1)
>          ::SysError("TUnixSystem::UnixDynFindSymbol", "shl_findsym");
>       return addr;
>    }
>    return 0;
> #else
>    if (lib || entry) { }
> 
>    // Always assume symbol not found
>    return 0;
> #endif
> }

-- 
Org:    CERN, European Laboratory for Particle Physics.
Mail:   1211 Geneve 23, Switzerland
E-Mail: Fons.Rademakers@cern.ch              Phone: +41 22 7679248
WWW:    http://root.cern.ch/~rdm/            Fax:   +41 22 7677910



This archive was generated by hypermail 2b29 : Tue Jan 01 2002 - 17:50:44 MET