在加载perl模块之前修改ld.so路径

时间:2010-12-03 14:41:56

标签: linux perl module shared-libraries

我正在尝试设置一个特定的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 个答案:

答案 0 :(得分:5)

可以

替换你脚本的顶部
#!/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

答案 1 :(得分:0)

在Perl脚本中设置LD_LIBRARY_PATH的原因是,在Perl运行时,动态加载程序已经读取了LD_LIBRARY_PATH并且没有重新读取它。因此,即使是BEGIN块也为时已晚 - 动态加载器已经读取了它所需的内容。