[ 
https://issues.apache.org/jira/browse/HADOOP-8806?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13456291#comment-13456291
 ] 

Andy Isaacson commented on HADOOP-8806:
---------------------------------------

I ran a standalone test of {{DT_RPATH $ORIGIN}}.  There's good news and bad 
news which is probably ok.

On the plus side, setting DT_RPATH=$ORIGIN on libhadoop.so does allow it to 
find libsnappy.so in the same directory.  This is good.

On the downside, setting DT_RPATH=$ORIGIN on libhadoop.so pollutes the search 
path for later dlopens in the main executable.  In my test,
{noformat}
  main.c
    -> dlopens /path/to/libbar.so with DT_RPATH=$ORIGIN
          -> dlopens libfoo.so
    -> dlopens libfoo.so
{noformat}
Since main.c is supposed to be unaffected by the behavior of libbar, the final 
dlopen should fail since main's search path does not include libfoo.

Unfortunately the final dlopen succeeds.  This means that the libfoo opened by 
libbar, while loaded, is available for open by main.

Modifying the test so that libbar.so dlclose()s libfoo before returning fixes 
the problem; the final open of libfoo fails again.  So it's not a problem of 
libbar's DT_RPATH polluting the main executable's search path, but rather, a 
single table of currently open objects.

What does this mean?  Suppose we have a libsnappy.1.0.14 in $ORIGIN, and the 
system has a libsnappy.1.0.20 in /usr/lib.  A program which uses libhadoop will 
get 1.0.14 if libhadoop is opened before libsnappy, and 1.0.20 if libsnappy is 
opened before libhadoop.  This kinda sucks. But, it's definitely a corner case, 
so maybe it's OK.

If we used RUNPATH rather than RPATH, the user could work around the above 
problem by setting LD_LIBRARY_PATH.  Since it's probably safer from a build 
perspective to use RPATH -- I couldn't even figure out how to get ld-2.22 to 
set RUNPATH -- then LD_LIBRARY_PATH will not work. 
                
> libhadoop.so: dlopen should be better at locating libsnappy.so, etc.
> --------------------------------------------------------------------
>
>                 Key: HADOOP-8806
>                 URL: https://issues.apache.org/jira/browse/HADOOP-8806
>             Project: Hadoop Common
>          Issue Type: Improvement
>            Reporter: Colin Patrick McCabe
>            Assignee: Colin Patrick McCabe
>            Priority: Minor
>         Attachments: HADOOP-8806.003.patch
>
>
> libhadoop calls {{dlopen}} to load {{libsnappy.so}} and {{libz.so}}.  These 
> libraries can be bundled in the {{$HADOOP_ROOT/lib/native}} directory.  For 
> example, the {{-Dbundle.snappy}} build option copies {{libsnappy.so}} to this 
> directory.  However, snappy can't be loaded from this directory unless 
> {{LD_LIBRARY_PATH}} is set to include this directory.
> Can we make this configuration "just work" without needing to rely on 
> {{LD_LIBRARY_PATH}}?

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to