in reply to PAR+DBD::Oracle assistance

I do see file 08708f45.so there and has good permissions.

What the error message is trying to tell you is that 08708f45.so can't be loaded because the shared library libclntsh.so.10.1 (that 08708f45.so is linked against) is not found.

Okay, just a guess... but Solaris' dynamic loader (ld.so.1) is special in that you can't modify LD_LIBRARY_PATH (required to find shared libs in non-standard locations) from within an already running program — due to caching at exec time.  (Also see %ENV and DBI, for example.)

If I'm reading the PAR sources correctly, it does add its temp directory to LD_LIBRARY_PATH after unpacking, but AFAICT, it does not run the actual script via exec or system, but rather via do (which does not create a new process, so the above caching issue would apply). My assessment of the situation - based on quickly grepping through the sources - could be wrong, though...(!)

Anyhow, a possible workaround that you could try is to re-exec your script, e.g.

#!/usr/bin/perl BEGIN { unless ($ENV{DONE_RESTARTING_MYSELF}) { # avoid endless loop... $ENV{DONE_RESTARTING_MYSELF} = 1; exec $^X, $0, @ARGV; } } # ...

Replies are listed 'Best First'.
Re^2: PAR+DBD::Oracle assistance
by Viko (Acolyte) on Dec 17, 2008 at 17:13 UTC
    Almut,

    I had seen the issue with solaris ENVs before and had found the solution here at PerlMonks. However, PAR does handle that part effectively - when running my script and printing $ENV{LD_LIBRARY_PATH}, I get the correct cache dir.

    What I did find out (thanks to the replies to my question) is that PAR isn't extracting libclntsh.so.10.1 and libnnz10.so as is expected.

    Is this a bug, or am I doing something weird?

    Update: Looks like someone else already asked a similar question: http://www.perlmonks.org/?node_id=422008. I was expecting PAR to extract all files and file structure by itself...
      However, PAR does handle that part effectively - when running my script and printing $ENV{LD_LIBRARY_PATH}, I get the correct cache dir.

      The point I was trying to make is that even though PAR is setting LD_LIBRARY_PATH to the correct directory, the dynamic loader will ignore it. This is because - on Solaris - LD_LIBRARY_PATH is parsed only once at process startup, and PAR modifies it after that. This means that if the program later tries to dynamically load other libs at runtime via dlopen (as DynaLoader does) from that non-standard location, it won't work...  unless you re-exec the program to have LD_LIBRARY_PATH be re-read.

      But as it seems, you're not even at a point where this would matter :) — i.e. with libclntsh.so.10.1 and libnnz10.so not having been extracted at all...  I'm afraid I can't help with the latter problem.