Почему я должен использовать LD_PRELOAD для libcl.2, чтобы использовать XML::LibXML::Common в HP/UX?

Принуждение LD_PRELOAD только на платформе HP, но не на других разновидностях Unix (AIX, Linux и Solaris).

Я создал модуль Perl XML::LibXML::Common для всех разновидностей Unix. . Мне пришлось специально выполнить LD_PRELOAD для библиотеки libcl.2 только на платформе HP. В то время как на других unix-платформах ничего как такового не требовалось.

Является ли это поведением ОС или чего-то действительно не хватает в загрузчике/компиляторе HP?

Я запускал perl-скрипт, который просто создает новый объект "XML::LibXML::SAX"

use XML::LibXML::SAX;
$x = XML::LibXML::SAX->new();

и он жаловался на

Не удается загрузить «site_perl/5.8.8/PA-RISC2.0-thread-multi/auto/XML/LibXML/Common/Common.sl» для модуля XML::LibXML::Common: ошибка формата Exec

и когда я делаю LD_PRELOAD для libcl.2, ошибка исчезает, и Perl построен для поддержки многопоточности.


person kadeshpa    schedule 15.04.2009    source источник


Ответы (4)


Я думаю, вы спрашиваете, почему вы должны его использовать. Если вы используете Perl в многопоточном режиме, одна из вызываемых вами библиотек загружается раньше libc и, скорее всего, является однопоточной. В рамках обработки зависимостей он пытается загрузить многопоточную библиотеку в вашей среде. Используя LD_PRELOAD, я думаю, вы используете принцип интерпозиции библиотек, чтобы принудительно загрузить эту библиотеку до загрузки небезопасной библиотеки. Понятие интерпозиции является сложным, и вы можете извлечь некоторую пользу из следующей ссылки:

Отрывок:

Чтобы использовать интерпозицию библиотек, вам нужно создать специальную общую библиотеку и установить переменную среды LD_PRELOAD. Когда LD_PRELOAD установлен, динамический компоновщик будет использовать указанную библиотеку перед любой другой при поиске общих библиотек.

person ojblass    schedule 21.04.2009

Ваш вопрос не ясен... почему вам пришлось использовать LD_PRELOAD?

Это потому, что HP-UX использует SHLIB_PATH вместо LD_LIBRARY_PATH, поэтому вы задали неправильную переменную среды?

На других платформах он также имеет другое написание — Solaris и Linux имеют почти одинаковый набор env. варс. MacOS X использует DYLIB_LIBRARY_PATH; Насколько я знаю, AIX использует LIBPATH.

person Jonathan Leffler    schedule 15.04.2009
comment
Да, мне пришлось сделать LD_PRELOAD на HP. Я не говорю об среде, где найти библиотеку с LIBPATHS (полагаю, синонимы различаются в зависимости от ОС). Я имел в виду, что мне нужно было специально загрузить библиотеку, и это не имеет ничего общего с поиском библиотеки, указывающей переменные env. . надеюсь, я имею смысл. - person kadeshpa; 15.04.2009
comment
Зачем нужно было загружать библиотеку? Было ли это переопределением символов из другой библиотеки? Есть ли файл libcl.sl, который вам нужно заменить? На данный момент вы не объяснили, что пошло не так, прежде чем выполнить LD_PRELOAD. Итак, я в замешательстве; отсутствие других ответов предполагает, что и другие тоже. - person Jonathan Leffler; 16.04.2009

Хотя это старая тема, я прямо сейчас вижу что-то похожее на HP-UX. В моем случае это не Perl, но при сборке привязки Python к sqlite3 динамическая загрузка /usr/lib/libcl.2 не работает.

Я запустил скрипт конфигурации с параметром --with-libs='-lcl'. Хотя связывание его с двоичным файлом и использование LD_PRELOAD не одно и то же, оба изменяются при загрузке /usr/lib/libcl.2. Поскольку это решило мое, попробуйте это.

person Naoyuki Tai    schedule 03.04.2013

Я не уверен, что это актуально, но, вероятно, это так. Perl, входящий в состав HP-UX, — это не стандартный Perl, а копия ActiveState Perl — вместе со всеми его странностями. Если вы обнаружите, что Perl ведет себя странно в HP-UX, в отличие от любой другой среды, проверьте, не виноват ли ActiveState Perl.

person Mei    schedule 04.06.2009