dependencies in .so files
guido@sirio.stat.unipd.it
guido@sirio.stat.unipd.it
Wed, 27 May 1998 22:10:18 +0100 (GMT+0100)
> Luke Tierney writes:
>
> guido@sirio.stat.unipd.it wrote:
> > So, I try:
> > 1) I modify src/unix/dynload.c changing the flag of dlopen
> > from RTLD_LAZY to (RTLD_LAZY | RTLD_GLOBAL)
>
> I'm not sure this is properly and reliably supported on all UNIX
> platforms. It doesn't seem to be in the standard Windows and Mac
> compilers. That is, MS VC++ and Borland C++ don't seem to let you
> creade DLL's with undefined symbols. Watcom does seem to allow it, but
> I'm not certain how reliable it is there.
If I understand, under Windows , you have to follow your strategy B (recursive
shared libraries).
>
> Also you need to consider what happens at runtime if a function is
> called and finds an unresolved symbol. On some systems a signal might
> be sent that can be caught (HP-UX sends SIGABRT, but I'm not sure I
> would want to catch all those), but this will need to be checked out
> on every different system. Having any problems reported at load time
> seems like a safer solution -- I have gone the other way and switched
> to using RTLD_NOW for this reason (and because that seems the least
> common denominator accross UNIX/Win32/Mac).
I agree. This point is however indipendent from linking a
shared library which needs another shared library. This has
to do with the RTLD_LAZY flag not with the RTLD_GLOBAL one.
In the example I used the RTLD_LAZY flag only because the current version of
R uses it.
The use of RTLD_NOW will also make debugging easier.
An example was the missing routines
problem in the locfit package (a couple of messages a month ago).
I found out that the shared library misses a couple of routines
compiling the package under Windows. But, under Unix, no
errors in building the library.
But, if you try to use the R function which calls
a C function with an unresolved routine you get a segmentation fault
(or at least, I got it).
> The alternative is to use the OS's ld or equivalent to create a
> library that knows what it needs to call at link time by telling ld
> what other shared libraries it needs; in this case
>
> >
> > a.so: a.o
> > gcc -shared -o a.so a.o
> >
> > b.o: b.c
> > gcc -fPIC -c b.c
> >
> > b.so: b.o
> > gcc -shared -o b.so b.o
> >
>
> would change to
>
> ...
> b.so: b.o
> gcc -shared -o b.so b.o a.so
>
> Mutually recursive libraries can be handled this way on most UNIX
> systems I think; for Win32 there are some standard tricks involving
> .def and .lib files (that I can't remember in detail but I think I
> found them once on MS's web site) for making DLL's that are mutually
> recursive. I haven't looked into mutual recursion on the Mac.
>
Under Linux, the problem with this approach is that the dynamic
linker (ld.so) must find a.so at runtime. I have just tried
on the previous example but I can't load the so builded b.so in R.
guido m.
-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-devel mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !) To: r-devel-request@stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._