[Rd] 2 versions of same library loaded

William Dunlap wdunlap at tibco.com
Thu Mar 13 16:21:26 CET 2014


Have you tried using the environment variable LD_DEBUG to
see what the dynamic linker is doing?  E.g.,

  env LD_DEBUG=files R
or
  % setenv RHOME `R RHOME`
  % R CMD env LD_DEBUG=files $RHOME/bin/exec/R
      2322:
      2322:     file=libR.so [0];  needed by /opt/sw/R/R-3.0.2.atlas1/lib/R/bin/exec/R [0]
      2322:     file=libR.so [0];  generating link map
      2322:       dynamic: 0x00007f484e2da0b8  base: 0x00007f484de30000   size: 0x00000000005a0c60
      2322:         entry: 0x00007f484de59e60  phdr: 0x00007f484de30040  phnum:                  7
      2322:
      2322:
      2322:     file=libpthread.so.0 [0];  needed by /opt/sw/R/R-3.0.2.atlas1/lib/R/bin/exec/R [0]
      2322:     file=libpthread.so.0 [0];  generating link map
      2322:       dynamic: 0x00007f484de2ad88  base: 0x00007f484dc13000   size: 0x000000000021c438
      2322:         entry: 0x00007f484dc19c50  phdr: 0x00007f484dc13040  phnum:                  9
      2322:
      2322:
      2322:     file=libc.so.6 [0];  needed by /opt/sw/R/R-3.0.2.atlas1/lib/R/bin/exec/R [0]
      2322:     file=libc.so.6 [0];  generating link map
      2322:       dynamic: 0x00007f484dc0bb40  base: 0x00007f484d870000   size: 0x00000000003a2368
      2322:         entry: 0x00007f484d891420  phdr: 0x00007f484d870040  phnum:                 10
      ...
      > library(lme4)
      ... lots more messages about shared objects being loaded.

See 'man ld.so' for more information; run 'env LD_DEBUG=help echo foo' for the available options.

> > > Before running I set LD_LIBRARY_PATH to
> > > ~/install/lib, and then stuffed the same path at the start of
> > > LD_LIBRARY_PATH using Sys.setenv in my profile
It has been a long time since I worried about these things, but I thought that changing
LD_LIBRARY_PATH after a process starts has no effect on the dynamic linking done for
the current process - ld.so only looks at LD_LIBRARY_PATH when ls.so starts.

Bill Dunlap
TIBCO Software
wdunlap tibco.com


> -----Original Message-----
> From: r-devel-bounces at r-project.org [mailto:r-devel-bounces at r-project.org] On Behalf
> Of Ross Boylan
> Sent: Wednesday, March 12, 2014 10:01 PM
> To: Simon Urbanek
> Cc: r-devel at r-project.org
> Subject: Re: [Rd] 2 versions of same library loaded
> 
> Comments/questions interspersed below.
> On Wed, 2014-03-12 at 22:50 -0400, Simon Urbanek wrote:
> > Ross,
> >
> > On Mar 12, 2014, at 5:34 PM, Ross Boylan <ross at biostat.ucsf.edu> wrote:
> >
> > > Can anyone help me understand how I got 2 versions of the same library
> > > loaded, how to prevent it, and what the consequences are?  Running under
> > > Debian GNU/Linux squeeze.
> > >
> > > lsof and /proc/xxx/map both show 2 copies of several libraries loaded:
> > > /home/ross/install/lib/libmpi.so.1.3.0
> > > /home/ross/install/lib/libopen-pal.so.6.1.0
> > > /home/ross/install/lib/libopen-rte.so.7.0.0
> > > /home/ross/Rlib-3.0.1/Rmpi/libs/Rmpi.so
> > > /usr/lib/openmpi/lib/libmpi.so.0.0.2
> > > /usr/lib/openmpi/lib/libopen-pal.so.0.0.0
> > > /usr/lib/openmpi/lib/libopen-rte.so.0.0.0
> > > /usr/lib/R/lib/libR.so
> > >
> > >
> > > The system has the old version of MPI installed under /usr/lib.  I built
> > > a personal, newer copy in my directory, and then rebuilt Rmpi (an R
> > > package) against it.  ldd on the personal Rmpi.so and libmpi.so shows
> > > all references to mpi libraries on personal paths.
> > >
> > > R was installed from a debian package, and presumably compiled without
> > > having MPI around.  Before running I set LD_LIBRARY_PATH to
> > > ~/install/lib, and then stuffed the same path at the start of
> > > LD_LIBRARY_PATH using Sys.setenv in my profile because R seems to
> > > prepend some libraries to that path when it starts (I'm curious about
> > > that too).  I also prepended ~/install/bin to my path, though I'm not
> > > sure that's relevant.
> > >
> > > Does R use ld.so or some other mechanism for loading libraries?
> > >
> >
> > R uses dlopen to load package libraries - it is essentially identical to using ld.so for
> dependencies.
> >
> >
> > > Can I assume the highest version number of a library will be preferred?
> >
> > No.
> >
> Bummer.  The fact that Rmpi is not crashing suggests to me it's using
> the right version of the mpi libraries (it does produce lots of errors
> if I run it without setting LD_LIBRARY_PATH so only the system mpi libs
> are in play), but it would be nice to be certain.  Or the 2 versions
> could be combined in a big mess.
> >
> > > http://cran.r-project.org/doc/manuals/r-devel/R-exts.html#index-Dynamic-loading
> says "If a shared object/DLL is loaded more than once the most recent version is used."
> I'm not sure if "most recent" means the one loaded most recently by the program (I don't
> know which that is) or "highest version number."
> > >
> >
> > The former - whichever you load last wins. Note, however, that this refers to explicitly
> loaded objects since they are loaded into a flat namespace so a load will overwrite all
> symbols that get loaded.
> It might be good to clarify that in the manual.
> 
> If I understand the term, the mpi libraries are loaded implicitly; that
> is, Rmpi.so is loaded explicitly, and then it pulls in dependencies.
> What are the rules in that case?
> 
> >
> >
> > > Why is /usr/lib/openmpi being looked at in the first place?
> > >
> >
> > You'll have to consult your system. The search path (assuming rpath is not involved) is
> governed by LD_LIBRARY_PATH and /etc/ld.so.conf*. Note that LD_LIBRARY_PATH is
> consulted at the time of the resolution (when the library is looked up), so you may be
> changing it too late. Also note that you have to expand ~ in the path (it's not a valid path,
> it's a shell expansion feature).
> >
> I just used the ~ as a shortcut; the shell expanded it and the full path
> ended up in the variable.
> 
> I assume the loader checks LD_LIBRARY_PATH first; once it finds the mpi
> libraries there I don't know why it keeps looking.
> 
> I'm not sure I follow the part about too late, but is it this?: all the
> R's launched under MPI have the MPI library loaded automatically.   If
> that happens before my profile is read, reseting LD_LIBRARY_PATH will be
> irrelevant.  I don't know whether the profile or Rmpi load happens
> first.
> 
> The reseting is just a reordering, and since the  other elements in
> LD_LIBRARY_PATH don't have any mpi libraries I don't think the order
> matters.
> 
> 
> > R's massaging of the LD_LIBRARY_PATH is typically done in $R_HOME/etc/ldpaths so
> you may want to check it and/or adjust it as needed. Normally (in stock R), it only
> prepends its own libraries and Java so it should not be causing any issues, but you may
> want to check in case Debian scripts add anything else.
> >
> The extra paths are limited as you describe, and so are probably no
> threat for loading the wrong MPI library
> (/usr/lib64/R/lib:/usr/lib/jvm/java-6-openjdk/jre/lib/amd64/server).
> >
> > > How can I stop the madness?  Some folks on the openmpi list have
> > > indicated I need to rebuild R, telling it where my MPI is, but that
> > > seems an awfully big hammer for the problem.
> > >
> >
> > I would check LD_LIBRARY_PATH and also check at which point are those old libraries
> loaded to find where they are referenced.
> How do I tell the point at which the old libraries are loaded?  I assume
> it happens implicitly when Rmpi is loaded, but I don't know which of the
> 2 versions of the libraries is loaded first, and I don't know how to
> tell.
> 
> Thanks for your help.
> Ross Boylan
> 
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel



More information about the R-devel mailing list