[Rd] modules with libtool and -dlpreopen
Marcus G. Daniels
mgd at santafe.edu
Thu Feb 3 01:44:51 CET 2005
Prof Brian Ripley wrote:
> Some of them use Fortran, please note, and libtool is none too good at
> that.
I didn't have an (obvious) problem with that. I did notice that DYLIB_*
variables in Makeconf.in didn't have USE_LIBTOOL_TRUE/FALSE
conditionalizations. That was a place it broke for me with Fortran code
in modules. Was it a compile-time problem or a run-time problem you saw?
Also I noticed compilation invocations weren't set up in R 2.0.1 to prepend
"libtool --mode=compile". When I inserted those for C and Fortran,
reactivated the linkage code for libtool that was already there, and
then went through each module and made *.lo the dependency instead of
*.o, and made *.la the target instead of *.so, I managed to get (.la)
modules installed in the build tree under
/build/R/library/{tools,grid,methods,splines,stats,tools).
Next I went to the src/unix directory and removed the object code, and
rebuilt using:
make CPPFLAGS='-Ddlsym=lt_dlsym -Ddlopen=lt_dlopen -Ddlclose=lt_dlclose'
After that I went back to the src/main directory and first edited
Rmain.c to add an include of ltdl.h , a call to
LTDL_SET_PRELOADED_SYMBOLS() and a call to "lt_dlinit ()" before
"Rf_initialize_R (ac, av)".
Then I modified the linkage of R.bin to add this at the start of the
command:
-dlpreopen /build/R/library/tools/libs/tools.la -dlpreopen
/build/R/library/stats/libs/stats.la -dlpreopen
/build/R/library/methods/libs/methods.la -dlpreopen
/build/R/library/grid/libs/grid.la -dlpreopen
/build/R/library/stats/libs/splines.la
and:
-lltdl
at the end of the link (the libtool dlopen compatibility interface).
Following that I just went to the top of the build tree of R and let the
build finish.
As you can see, no calls to dlsym get made:
$ R_HOME=/build/R gdb ./R.bin -q
Using host libthread_db library "/lib/tls/libthread_db.so.1".
(gdb) break main
Breakpoint 1 at 0x8060c52: file /src/R-2.0.1/src/main/Rmain.c, line 32.
(gdb) run -q
Starting program: /build/R/src/main/R.bin -q
Breakpoint 1, main (ac=2, av=0xfefbce44) at /src/R-2.0.1/src/main/Rmain.c:32
32 {
(gdb) break dlsym
Breakpoint 2 at 0xf6fa3de6
(gdb) c
Continuing.
Detaching after fork from child process 6376.
>
Compare this to a default build of R on Linux that would have them:
$ R -d 'gdb -q' -q
(no debugging symbols found)...Using host libthread_db library
"/lib/tls/libthread_db.so.1".
(gdb) break main
Breakpoint 1 at 0x805ceb6
(gdb) run -q
Starting program: /usr/lib/R/bin/exec/R -q
(no debugging symbols found)...(no debugging symbols found)...
Breakpoint 1, 0x0805ceb6 in main ()
(gdb) break dlsym
Breakpoint 2 at 0xf6f55de6
(gdb) c
Continuing.
Breakpoint 2, 0xf6f55de6 in dlsym () from /lib/libdl.so.2
(gdb)
More information about the R-devel
mailing list