From mgd at santafe.edu  Thu Feb  3 01:44:51 2005
From: mgd at santafe.edu (Marcus G. Daniels)
Date: Thu Feb  3 01:43:46 2005
Subject: [Rd] modules with libtool and -dlpreopen
In-Reply-To: <Pine.LNX.4.61.0502021940240.5376@gannet.stats>
References: <4201268E.90400@santafe.edu>
	<Pine.LNX.4.61.0502021940240.5376@gannet.stats>
Message-ID: <42017403.3010105@santafe.edu>

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)


[Rd] modules with libtool and -dlpreopen
Marcus G. Daniels