Re: How to set LD_LIBRARY_PATH

[email protected] ("Peter J. Holzer")
Newsgroups perl.dbi.users
Message-ID <[email protected]>
On 2010-05-31 15:52:21 +0200, Peter J. Holzer wrote:
> On Linux (at least i386[1]) the loader uses the current value of
> LD_LIBRARY_PATH when it is asked to load an .so file. So you can change
> LD_LIBRARY_PATH just before you want to load the library. 
> 
> On Solaris the loader uses the value of LD_LIBRARY_PATH at program
> startup. Changing LD_LIBRARY_PATH during runtime has no effect on the
> process itself, just its children. I don't know why this is the case,
> but I guess that LD_LIBRARY_PATH is split into components when the first
> library (probably libc) and after that the components aren't used any
> more.
> 
>         hp
> 
> 
> [1] I seem to remember that I ran into problems either on x86_64 or on
>     power, but I don't remember the details. If it's x86_64, I should be
>     able to test it (don't have access to power-based systems any more).

Just for the record: That problem does exist on Linux/x86_64.

I just ran into the issue moving a bunch of CGI scripts from a
Linux/i386 box to a Linux/x86_64 box. 

They do something like:

    if (open(E, "$offl_root/dbi/env")) {
        while (<E>) {
            chomp;
            my ($k, $v) = split(/=/);
            $ENV{$k} = $v; 
            printlog('DEBUG', "setting $k=$v");
        }
    }   
    my ($data_source, $username, $auth) = read_cred("$offl_root/dbi/usradm");

    my $dbh;
    eval {
        $dbh = DBI->connect($data_source, $username, $auth,
                            { AutoCommit => 0,
                              PrintError => 1,  
                              RaiseError => 1
                            }
                           );
    };  
    if ($@) {
        ...
    }

where $offl_root/dbi/env contains several environment variables, among
them ORACLE_HOME and LD_LIBRARY_PATH. 

On Linux/i386 this works fine. On Linux/x86_64 it fails with the error
message

connection to dbi:Oracle:wpdb.wsr.ac.at as usradm failed:
install_driver(Oracle) failed: Can't load
'/usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi/auto/DBD/Oracle/Oracle.so'
for module DBD::Oracle: libocci.so.10.1: cannot open shared object file:
No such file or directory at
/usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi/DynaLoader.pm line 230.

despite the fact that libocci.so.10.1 is in the LD_LIBRARY_PATH.

If I set LD_LIBRARY_PATH in the Apache config, it works as expected. 

So I conclude that Linux/x86_64, like Solaris, but unlike Linux/i386,
ignores changes to LD_LIBRARY_PATH after a program is started.

        hp



-- 
   _  | Peter J. Holzer    | Auf jedem Computer sollte der Satz Ludwigs II
|_|_) | Sysadmin WSR       | eingeprägt stehen: "Ein ewig Rätsel will ich
| |   | [email protected]      | bleiben, mir und andern."
__/   | http://www.hjp.at/ |    -- Wolfram Heinrich in desd
signature.asc (application/pgp-signature, 190 B)
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.10 (GNU/Linux)

iD8DBQFNPZGNMdFfQa64PCwRApLVAJ96oRF+lPEFoij6YPio7KnsBoSkQQCgm1z/
dpuzBPCgjbFiVAlqUWgTOHc=
=l9cQ
-----END PGP SIGNATURE-----
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.