如何修复与Carton一起安装的Net :: SSLeay? XS问题

时间:2013-11-05 21:58:46

标签: perl

我们使用Net::SSLeay 1.55Cartonuse lib安装到“本地”目录中。

编译时一切正常,但在Net::LDAP希望使用Net::SSLeay建立安全连接的运行时,我们得到:

Can't locate object method "tid" via package "threads" at /usr/lib64/perl5/XSLoader.pm line 94.

尝试在cpanfile中定义XS :: Loader并将其安装到Carton中,但是虽然调用了本地安装的XS :: Loader,但仍然会出现上述错误。

问题几乎肯定与this Net::SSLeay bug有关(因为我们实际上是在程序中覆盖SIG{DIE},这会触发错误),但据报道该错误已在{{1}中修复}。

在我们的系统上,我们Net::SSLeay 1.46(显然由系统/usr/lib64/perl5/auto/Net/SSLeay/SSLeay.so使用)以及本地安装的Net::SSLeay 1.34SSLeay.so使用。但也许正在使用系统Net::SSLeay 1.55

我们如何确保SSLeay.so使用正确的Net::SSLeay文件(如果这仍然是我们仍然看到错误的原因),或以其他方式击败此错误?

.so

2 个答案:

答案 0 :(得分:0)

你得到了一个system-perl或一个local :: lib mixup。

有人将系统perl称为可执行文件而不是私有$^X,导致调用错误的模块。现在有些人仍然认为只有一个perl。从有限的信息来看,这似乎不是你的情况。

或者某人正在弄乱@INC,更喜欢错误的模块路径超过您的本地@INC。看起来你正在调用旧系统Net :: SSLeay 1.34。

XSLoader通常会忽略自定义LD_LIBRARY_PATH覆盖,因此不能这样。

您的问题中存在错误: 在我们的系统上,我们有/usr/lib64/perl5/auto/Net/SSLeay/SSLeay.so(显然由系统Net :: SSLeay 1.34使用)以及本地安装的SSLeay.so供使用通过Net :: SSLeay 1.55。

您的本地Net :: SSLeay 1.55 SSLeay.so不能位于系统路径中。它位于您的Carton本地路径中。 这应该给你编译版本:

$ strings /usr/lib64/perl5/auto/Net/SSLeay/SSLeay.so |grep ^1\.
=> 1.34

答案 1 :(得分:0)

运行perl v5.20.2和Net :: SSLeay 1.65随debian 8一起运行我看到了相同的行为。 如果您在Canton中有SSLeay.pm,那么您还应该拥有共享对象文件,以及自动加载的索引文件和可自动加载的函数文件::

Canton/Net/SSLeay.pm
Canton/auto/Net/SSLeay/SSLeay.so
Canton/auto/Net/SSLeay/autosplit.ix
Canton/auto/Net/SSLeay/debug_read.al
...

通过Canton或环境变量PERL5LIB将@INC添加到use lib之前,从那里加载.so文件等。您可以确保运行strace perl -Mlib=Canton -MNet::SSLeay -e 1 2>&1 | grep SSLeay

但如上所述,即使使用Net :: SSLeay 1.65,如果我在加载Net :: SSLeay之前设置die()处理程序,我也会收到来自DynaLoader的$SIG{__DIE__}消息。我这样沉默:

use Carp;
BEGIN {
    $SIG{__DIE__} = \&Carp::croak;
}
...
# use Net::SSLeay; <-- this triggers the die message
BEGIN {
    local $SIG{__DIE__};
    my $mod = 'Net::SSLeay'; # or anything that uses N::S, e.g. Net::LDAP
    my $ret = eval "use $mod; 1";
    die "Can't load $mod: $@\n"
        unless $ret;
}

这很麻烦,但至少它是解决这个问题的方法。