Изменение путей ld.so перед загрузкой модулей perl - PullRequest
2 голосов
/ 03 декабря 2010

Я пытаюсь установить конкретный LD_LIBRARY_PATH для загрузки модифицированной версии libpcap вместо общесистемной.

Это работает, конечно, если я запускаю весь скрипт с LD_LIBRARY_PATH=/blah ./script_name. Я хочу сделать это прозрачным для пользователя, поэтому я попытался установить $ENV{'LD_LIBRARY_PATH'}. Это, однако, не меняет поведение. Я пытался поместить его в блок BEGIN, чтобы он работал раньше других use -s, но там тоже не повезло.

Я подозреваю, что это из-за того, что ld загружает все конфиги / конфигурирует себя в начале процесса перед запуском любой части скрипта. Есть ли способ заставить его работать?

Я бы хотел избежать глупостей вроде:

if (check_parent()) { $ENV...=.... ; `$0` ; exit }

(или внешние обертки, как было предложено - чем меньше беспорядочных и случайных оберток, тем лучше)

Ответы [ 2 ]

5 голосов
/ 03 декабря 2010

Вы можете заменить верхнюю часть вашего скрипта на

#!/bin/sh
LD_LIBRARY_PATH="/blah:$LD_LIBRARY_PATH"
export LD_LIBRARY_PATH
exec perl -x -S "$0" "$@" || exit 1
#!perl

# rest of your script
0 голосов
/ 04 декабря 2010

Причина, по которой установка LD_LIBRARY_PATH в скрипте Perl не имеет никакого эффекта, заключается в том, что к моменту запуска Perl динамический загрузчик уже прочитал LD_LIBRARY_PATH и не перечитал его. Таким образом, даже блок BEGIN слишком поздний - динамический загрузчик уже прочитал то, что ему нужно.

...