2

我们已经使用andNet::SSLeay 1.55安装到一个“本地”目录中。Cartonuse 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,但仍然出现上述错误。

这个问题几乎可以肯定与这个 Net::SSLeay 错误有关(因为实际上我们SIG{DIE}在程序中重写,这会触发错误),但据报道该错误已在Net::SSLeay 1.46.

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

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

$ perl -v

This is perl, v5.10.1 (*) built for x86_64-linux-thread-multi
4

2 回答 2

0

你要么得到一个 system-perl,要么得到一个 local::lib mixup。

有人将系统 perl 称为可执行文件而不是您的 private $^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.55SSLeay.so不能在系统路径中。它位于您的 Carton 本地路径中。这应该给你编译的版本:

$ strings /usr/lib64/perl5/auto/Net/SSLeay/SSLeay.so |grep ^1\.
=> 1.34
于 2015-07-10T09:50:16.413 回答
0

运行 debian 8 附带的 perl v5.20.2 和 Net::SSLeay 1.65 我看到了相同的行为。如果你有你的 SSLeay.pm Canton,你应该也有共享对象文件,以及自动拆分索引文件和自动加载功能文件:

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

在via或环境变量CantonPERL5LIB之前,.so 文件等从那里加载。你可以确保运行。@INCuse libstrace 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;
}

这很麻烦,但至少它是一种解决方法。

于 2017-07-27T05:58:28.157 回答