LINUX.ORG.RU

Perl, LD_LIBRARY_PATH


0

0

Есть такая проблема: сайт использует GD::SecurityImage, поэтому ему нужна GD, у меня GD.so собрана с поддержкой libXpm.
Вот что происходит при запуске скрипта:
Can't load '/usr/lib/perl5/auto/GD/GD.so' for module GD: libXpm.so.4: cannot open shared object file: No such file or directory at /usr/lib/perl/5.8/DynaLoader.pm line 225. at /usr/share/perl5/GD/SecurityImage/GD.pm line 21

Здесь всё понятно, ему нужен libXpm.so.4, хорошо, создаём папку lib и кидаем туда эту библиотеку.
 Как теперь сказать perl-у, что нужно смотреть в той папке? Если из консоли запускать LD_LIBRARY_PATH=/path/to/lib ./get_captcha.cgi, то всё
нормально. 
А как в программе поменять этот LD_LIBRARY_PATH ? 

Если в инициализацию вставить $ENV{LD_LIBRARY_PATH} = '/path/to/lib', то ничего не происходит. 
Причём если в инициализации ввести неправильный путь, а в консоли установить переменную правильно, то всё работает, т.е. загрузчик
библиотеки смотрит только на переменную окружения шелла, а не самого процесса (которая меняется, я проверял). Из этого я делаю
странный вывод, что программа-загрузчик форкается не от перла? Или я чего то не понимаю?
★★★★★
Ответ на: комментарий от Gharik

На машине, где хостится сайт, не установлена библиотека libXpm. У меня на локалхосте всё конечно нормально. Я хочу просто скопировать нужные .so файлы в папку с сайтом, чтобы perl их подхватил.

Legioner ★★★★★
() автор топика
Ответ на: комментарий от Legioner

Ну... а что, есть разница?

ldd $path_to/libXpm.so

смотрим от чего зависит... суем все найденное в "~/lib"

export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:~/lib"
ldconfig

И что-то мне подсказывает, что запуск "ldconfig" - вовсе излишний...

Gharik
()
Ответ на: комментарий от Legioner

Еще вариант - собери GD.so используя статическую libXpm.a, проблема вообще не встанет

Gharik
()
Ответ на: комментарий от Gharik

где писать export LD_... ? Шелла там нет, а если бы и был, скрипты ведь запускаются не шеллом а апачом, который знать ничего не знает про ~/lib.

> Еще вариант - собери GD.so используя статическую libXpm.a, проблема вообще не встанет Можно конечно, но это последний вариант. Привык знаете ли к дебиану, уже полгода почти ничего не собирал :)

Мне интересно, почему переопределение переменной окружения не работает.

Legioner ★★★★★
() автор топика
Ответ на: комментарий от Legioner

> Мне интересно, почему переопределение переменной окружения не работает.

видимо, потому, что ld читает переменные окружения один раз на старте процесса.
Можно попробовать сделать что-нибудь типа

#!/usr/bin/perl

use strict;

use Getopt::Long;

BEGIN {
  my $really_work; 
  GetOptions("real" => \$really_work);

  unless ($really_work) {
    $ENV{'LD_LIBRARY_PATH'} = '/home/legioner/lib';
    use FindBin qw/$Bin $Script/;
    exec "$Bin/$Script", '--real';
  }
}

use GD;

А вообще - там mod_perl или CGI-ники? Может быть, правильнее конфиг апача починить?

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.