Perl undefined yp_get_default_domain обнаружен DynaLoader.pm при использовании ARSperl, но библиотека существует

У меня есть сервер Ubuntu, который недавно обновил Perl до 5.14.2, когда я установил cpanminus. Это нарушило совместимость с модулем BMC Remedy API. Похоже, я не могу вернуться к старой версии Perl, поэтому я попытался перекомпилировать ARSperl для Perl 5.14.2.

Проблема в том, что когда я запускаю старый Perl-скрипт, использующий старый модуль, я получаю следующее:

Can't load '/usr/local/lib/perl5/5.14.2/auto/ARS/ARS.so' for module ARS:
/usr/local/lib/perl5/5.14.2/auto/ARS/ARS.so: undefined symbol:
yp_get_default_domain at /usr/local/lib/perl5/5.14.2/i686-linux/DynaLoader.pm line 190.

Итак, немного поиска в Google подсказывает мне, что yp_get_default_domain находится в libnsl. Я дошел до того, что попытался перекомпилировать как модуль ARSperl, так и сам Perl с явным вызовом "-lnsl" в Makefile. К сожалению, это ни к чему меня не привело. Библиотека действительно установлена ​​в системе в /usr/lib/i386-linux-gnu/.

В Makefile ARSperl:

LDFLAGS = -fstack-protector -L/usr/local/lib -L/usr/lib -L/usr/lib/i386-linux-gnu -lnsl

Поэтому у меня есть двойной вопрос к гуру Perl.

-Как определить, какой из Perl, DynaLoader или сам ARS.so не может найти «yp_get_default_domain»?

-Каков наилучший следующий шаг для устранения вышеуказанного сообщения DynaLoader об отсутствующей библиотеке, которая действительно присутствует в системе и связана с модулем?

Заранее спасибо за то, что поделились своими знаниями и советами.


person TCCSE    schedule 07.08.2014    source источник


Ответы (2)


Добавьте каталог, в котором установлена ​​библиотека, в $ARS_LDPATH в Makefile.PL.

Что-то типа

$ARSAPI      = "C:\\ARS_Library\\api764win";

if( $WINDOWS ){
  $ARS_LDPATH = qq{-L"$ARSAPI/lib"};
  $INCLUDES   = qq{-I"$ARSAPI/include"};
}else{
  $ARS_LDPATH = "-L$ARSAPI/lib";
  $INCLUDES   = "-I$ARSAPI/include";
}
person Chankey Pathak    schedule 07.08.2014
comment
Спасибо за ответ. Мне бы и в голову не пришло туда заглянуть, это действительно кажется очень логичным местом. Поскольку не похоже, что файл обрабатывает несколько путей в $INCLUDES, я пошел дальше и скопировал все файлы заголовков AR в /usr/include, скопировал все файлы библиотеки AR из /usr/ars/api/lib в / lib/i386-linux-gnu, а затем установите оба: $ARS_LDPATH = -L/lib/i386-linux-gnu $INCLUDES = -I/usr/include К сожалению, я получаю ту же ошибку. Однако он определенно присутствует: nm -D /lib/i386-linux-gnu/libnsl.so --› 00004170 T yp_get_default_domain Есть другие идеи? - person TCCSE; 08.08.2014

Мы обновились до ARSperl 1.93, начали использовать AR API версии 6.3, а не 5.1.2, и добавили «-lsnl» в ARSperl Makefile.PL $ARS_LIBS в разделе для 6.3.

Это приводило к тому, что каждый раз при запуске модуля ARS.so Perl давал сбой сегментации. После большого количества тестов и попыток диагностировать, почему возникают ошибки сегментации, мы перекомпилировали отдельный экземпляр Perl-5.14.2 из исходного кода в каталоге /opt/ и удалили параметр 64int. Обновление строк shebang во всех наших сценариях Perl, которым требуется модуль ARS для перенаправления на версию Perl в /opt, похоже, снова заработало.

Спасибо, Chankey Pathak, за то, что указал мне на Makefile.PL, без этого совета я бы не сразу начал искать возможность что-то там изменить.

person TCCSE    schedule 08.08.2014