Argonne National Laboratory

Experimental Physics and
Industrial Control System

1994  1995  1996  1997  1998  1999  2000  2001  2002  <20032004  2005  2006  2007  2008  2009  2010  2011  2012  2013  2014  2015  2016  2017  2018  2019  Index 1994  1995  1996  1997  1998  1999  2000  2001  2002  <20032004  2005  2006  2007  2008  2009  2010  2011  2012  2013  2014  2015  2016  2017  2018  2019 
<== Date ==> <== Thread ==>

Subject: Re: R3.14 and registerRecordDeviceDriver
From: Dirk Zimoch <dirk.zimoch@psi.ch>
To: Kate Feng <feng1@bnl.gov>, tech-talk@aps.anl.gov
Date: Tue, 24 Jun 2003 09:41:51 +0200
Hi Kate and all others,

Kate Feng wrote:
> ... My wish also gives RTEMS or Linux users an option to dynamically
> load a new application code (e.g. ld("new.obj")), which might need a
> new record/device/driver support entry table registered (e.g.
> new_SRCS += new_registerRecordDeviceDriver.cpp) at run time or even
> during an IOC test/development stage, which could occur very often
> during a development cycle. I actually found it handy in beamline
> applications.
> ...

Attached you will find a Linux (UNIX?) implementation of the 'ld'
command. Just link it to your iocsh. On Linux, it can load shared libraries (*.so). Maybe the code has to be modified to run on other platforms. I used the 'dlopen' function to implement it.


ld ("foo")

Searches LD_LIBRARY_PATH for libfoo.so, foo.so, foo (in this order).
After loading the code, all C++ constructors of global objects are executed (for registering, etc.)


I have not tried it on any other platform.

Dirk

--
Dr. Dirk Zimoch
Swiss Light Source
Paul Scherrer Institut
Computing and Controls
phone +41 56 310 5182
fax   +41 56 310 4413
/*
* ld - load code dynamically
*
* $Author$
* $ID$
* $Date$
*
* DISCLAIMER: Use at your own risc and so on. No warranty, no refund.
*/

#include <iocsh.h>
#include <stdio.h>
#include <dlfcn.h>

/* ld (dynamicLibrary) */
static const iocshArg ldArg0 = { "library", iocshArgString };
static const iocshArg * const ldArgs[1] = { &ldArg0 };
static const iocshFuncDef ldFuncDef = { "ld", 1, ldArgs };

static void ldCallFunc (const iocshArgBuf *args)
{
#ifdef UNIX
    char libname[256];
    
    if (!args[0].sval)
    {
        fprintf (stderr, "missing library name");
        return;
    }
    sprintf (libname, "lib%.249s.so", args[0].sval);
    if (dlopen (libname, RTLD_NOW|RTLD_GLOBAL)) return;
    sprintf (libname, "%.252s.so", args[0].sval);
    if (dlopen (libname, RTLD_NOW|RTLD_GLOBAL)) return;
    sprintf (libname, "%.255s", args[0].sval);
    if (dlopen (libname, RTLD_NOW|RTLD_GLOBAL)) return;
    fprintf (stderr, "%s\n", dlerror());
#else
    fprintf (stderr, "not supported for this operating system");
#endif
}

class IocshRegister {
public:
    IocshRegister (const iocshFuncDef& piocshFuncDef, iocshCallFunc func) {
        iocshRegister (&piocshFuncDef, func); }
};

static IocshRegister register_ld (ldFuncDef, ldCallFunc);

Replies:
Re: R3.14 and registerRecordDeviceDriver Kate Feng
References:
R3.14 and registerRecordDeviceDriver Kate Feng

Navigate by Date:
Prev: Re: R3.14 and registerRecordDeviceDriver Kate Feng
Next: EPICS collaboration meeting presentations Hayton, TG (Tim)
Index: 1994  1995  1996  1997  1998  1999  2000  2001  2002  <20032004  2005  2006  2007  2008  2009  2010  2011  2012  2013  2014  2015  2016  2017  2018  2019 
Navigate by Thread:
Prev: Re: R3.14 and registerRecordDeviceDriver Kate Feng
Next: Re: R3.14 and registerRecordDeviceDriver Kate Feng
Index: 1994  1995  1996  1997  1998  1999  2000  2001  2002  <20032004  2005  2006  2007  2008  2009  2010  2011  2012  2013  2014  2015  2016  2017  2018  2019 
ANJ, 10 Aug 2010 Valid HTML 4.01! · Home · News · About · Base · Modules · Extensions · Distributions · Download ·
· Search · EPICS V4 · IRMIS · Talk · Bugs · Documents · Links · Licensing ·