2010-12-03 5 views
2

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

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

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

Я хотел бы избежать глупых вещей, как:

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

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

+3

Как использовать скрипт bash bash, который будет экспортировать любые переменные, а затем выполнить скрипт perl? – thkala 2010-12-03 15:27:02

+0

@thkala: Это будет работать, конечно, но у меня уже есть другая оболочка для этого скрипта (и на самом деле это не его обязанность устанавливать переменные env), и в какой-то момент будет сложно управлять всеми слоями. Я ищу способ сделать это без каких-либо внешних помощников. – viraptor 2010-12-03 15:30:03

ответ

5

Вы могли заменить вверху вашего скрипта с

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

# rest of your script 
0

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

Смежные вопросы