On Fri, Apr 11, 2008 at 6:43 PM,  <[EMAIL PROTECTED]> wrote:
>   This problem happened to me when  I have packed newer version of the
>  external lib but there  was an older version of the same lib installed
>  on the target host. The  Dynaloader loads the older one first  and
>  then  my executable dies because older version of that external lib is
>  not supported by packed perl wrapper module.
>   How to pass a list of directories to look for the external shared
>  libs as an option to  pp utility ( like the LD_LIBRARY_PATH) which
>  will modify Dynaloader config ?

I can't reproduce this (with PAR::Packer 0.977 and Perl 5.10.0 on Linux),
at least not with the following simple example (XML::Parser::Expat is not
essential, I just needed a module that links to an external shared library,
libexpat.so.1 in this case):

$ pp -o foo.exe -l /usr/lib/libexpat.so.1 -e 'use XML::Parser::Expat;
print "hullo\n"'
$ strace -f -o truss -v -e trace=process,file -s 500 ./foo.exe
hullo

check that libexpat.so.1 has been packaged:
$  unzip -l foo.exe
...
      538  04-12-08 12:48   script/main.pl
       39  04-12-08 12:48   script/ppeiNuP.pl
   134348  07-24-07 23:03   shlib/i486-linux-gnu-thread-multi/libexpat.so.1

and looking at truss:

6510  
execve("/tmp/par-schupp/cache-5ed44847437f00b719fe3e1ea87ca31da183e7b8/foo.exe",
["./foo.exe"], 
[..."LD_LIBRARY_PATH=/tmp/par-schupp/cache-5ed44847437f00b719fe3e1ea87ca31da183e7b8",...])
= 0

so LD_LIBRARY_PATH is correctly set to look into PAR's cache first.
And the search for libexpat.so.1 proceeds like this (note that 166b167d.{bs,so}
is Expat.{bs,so} as renamed by PAR::Packer):

6510  
stat64("/tmp/par-schupp/cache-5ed44847437f00b719fe3e1ea87ca31da183e7b8/166b167d.bs",
0x97600c0) = -1 ENOENT (No such file or directory)
6510  
open("/tmp/par-schupp/cache-5ed44847437f00b719fe3e1ea87ca31da183e7b8/166b167d.so",
O_RDONLY) = 7
6510  
open("/tmp/par-schupp/cache-5ed44847437f00b719fe3e1ea87ca31da183e7b8/libexpat.so.1",
O_RDONLY) = 7

i.e. libexpat.so.1 has been loaded from the cache directory (and _not_
from /usr/lib)

AFAIK, external shared libraries are _not_ loaded by Dynaloader directly,
it only dlopen's the perl glue library, Expat.so in this example. The system
runtime loader then detects that Expat.so depends on libexpat.so.1

$ readelf -d /usr/lib/perl5/auto/XML/Parser/Expat/Expat.so

Dynamic section at offset 0x16bf8 contains 22 entries:
  Tag        Type                         Name/Value
 0x00000001 (NEEDED)                     Shared library: [libexpat.so.1]
 0x00000001 (NEEDED)                     Shared library: [libc.so.6]
 0x0000000c (INIT)                       0x28a4
 0x0000000d (FINI)                       0x15644
...

and loads it according to the LD_LIBRARY_PATH in effect.
Perhaps your glue library has absolute paths in the NEEDED tags
or has an RPATH tag (which may take precedence over LD_LIBRARY_PATH)?

Cheers, Roderich

Reply via email to