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

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

Я собрал Perl Module 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 создается для многопоточной поддержки.

Ответы [ 4 ]

2 голосов
/ 21 апреля 2009

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

Выдержки:

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

1 голос
/ 04 апреля 2013

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

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

1 голос
/ 15 апреля 2009

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

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

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

0 голосов
/ 04 июня 2009

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

...