Uniscan:可加载库和perl二进制文件不匹配

时间:2016-07-02 01:07:24

标签: c linux perl

Uniscan是一个用于扫描kali linux和其他笔测试发行版网站的工具。我曾经每周使用它来测试我的应用程序但是在我的linux工具进行一些更新之后,它现在在运行它时会出现以下错误:

  

xs / Moose.c:可加载库和perl二进制文件不匹配(获取握手密钥0xdb00080,需要0xdb80080)

我目前的perl版本是5.24.0。我在某地读到如果我降级perl版本可以绕过这个问题,但我没有找到它应该降级到哪个版本,我也尝试了我的包管理器缓存中可用的所有版本,没有工作,它实际上改变了{ {1}}文件导致握手不匹配。我也尝试将Uniscan更新到最新版本(6.3.1),也没有。>

无论如何,有谁知道如何解决这个问题?提前谢谢。

2 个答案:

答案 0 :(得分:4)

此错误消息来自perl解释器的Perl_xs_handshake函数。来自评论:

  

实现添加到.c的各种XS _ * _ BOOTCHECK宏      ExtUtils :: ParseXS创建的文件,用于检查构建模块的perl      with与运行的perl二进制兼容。

简而言之,这意味着Moose perl模块是针对perl解释器的不兼容版本构建的(即降级perl是一种可能的选项,但这有其自身的一组问题)。

Moose是面向对象的perl扩展框架。很常见的是,一些发行版预先构建它并将其作为单独的包包括在发行版中(例如,在fedora下,有一个perl-Moose fedora包。)

但是,Moose也可用作CPAN个包。

所以,如果你的发行版(kali)设置正确,事情应该照顾好自己(他们没有)。也就是说,如果kali升级perl,他们应该重建各种perl模块包(Moose就是其中之一)。

或者...... Moose 从未从发行版中安装,但是是从CPAN安装的(例如,作为其他内容的一部分)。

另一种方法是调用cpan并从那里下载,重建和安装Moose包。

要查找的一件事是通过Moose找到安装当前/usr/lib64/...的位置(例如/usr/local/lib64/...perldoc -lm Moose等)。这可能有助于配置cpan以安装目录。

<强>更新

  

我无法找到如何使用cpan单独重建Moose,我试过&#34; cpan Moose&#34; (使用-c,-m,也尝试使用-g下载和安装,没有工作)所以我运行了一个cpan -u来更新所有已安装的模块。之后问题仍然存在。

有两种类型的软件包:发行版软件包(例如kali软件包)和CPAN软件包。如果已从发行版安装了给定的perl模块,则cpan不太可能尝试更新它。我们需要做的是让cpan 安装(来自CPAN)。

当我使用cpan时,我通常会/full_path_to/perl -MCPAN -e shell。我使用完整路径的原因是我安装了多个不同的perl版本。有关为什么我有这些[和来拥有它们]的背景,请参阅我的回答https://serverfault.com/questions/741186/cpan-is-using-old-perl-version-to-install-modules/741216#741216

之后,在提示符处,我通常会执行install Moose之类的操作。它将寻找包依赖关系,我通常会对所有人说“是”。

cpan允许一些不同的安装&#34;模式&#34;。值得注意的是,安装系统范围(即您是sudo用户)或安装到$ HOME目录下的子目录。这允许非root用户安装CPAN模块,即使本地sysadmin不允许安装到/usr/lib64/...

查看$HOME/.cpan特别感兴趣的是$HOME/.cpan/CPAN/MyConfig.pm。在该文本文件中,查找与安装相关的信息:'make_install_make_command' => q[sudo /usr/bin/make]。它可能有也可能没有sudo。其中还有一些其他类似的选项(mbuild_install_build_command)。如果他们没有sudo,您可以手动编辑该文件。

我们稍后会回到这一点。但是,首先要做的是在uniscan下运行strace。无论如何配置,版本化等,这将记录正在发生的事情。这是一个脚本,其中包含我推荐用于strace的选项:

strace -ttt -i -f -ff -etrace=all -o /anyplace/log/whatever.spysys \
-eread=0,1,2,3,4,5,6,7,8,9,10 -ewrite=0,1,2,3,4,5,6,7,8,9,10 \
-eread=11,12,13,14,15,16,17,18,19,20,21 \
-ewrite=11,12,13,14,15,16,17,18,19,20,21 \
-eread=22,23,24,25,26,27,28,29,30,31,32 \
-ewrite=22,23,24,25,26,27,28,29,30,31,32 \
-eread=33,34,35,36,37,38,39,40,41,42,43 \
-ewrite=33,34,35,36,37,38,39,40,41,42,43 \
-eread=44,45,46,47,48,49,50,51,52,53,54 \
-ewrite=44,45,46,47,48,49,50,51,52,53,54 \
-eread=55,56,57,58,59,60,61,62,63,64,65 \
-ewrite=55,56,57,58,59,60,61,62,63,64,65 \
-eread=66,67,68,69,70,71,72,73,74,75,76 \
-ewrite=66,67,68,69,70,71,72,73,74,75,76 \
-eread=77,78,79,80,81,82,83,84,85,86,87 \
-ewrite=77,78,79,80,81,82,83,84,85,86,87 \
-eread=88,89,90,91,92,93,94,95,96,97,98 \
-ewrite=88,89,90,91,92,93,94,95,96,97,98 -eread=99 -ewrite=99 -x \
/usr/bin/whatever

/anyplace/...替换为适合您系统的内容。将/usr/bin/whatever替换为失败的uniscan命令。如果您通常以root身份运行uniscan,则可以stracesudo

前缀

请注意,strace的这些选项会生成输出的批次,但它们不会留下任何有价值的内容。最终,uniscan命令将[正如您已经遇到的那样]中止,但是,现在,strace输出将具有原因。

具体来说,通过筛选日志输出,您可以找到失败的Moose.so的确切完整路径。也就是说,perl将打开一个Moose相关文件(成功),然后很快将失败消息输出到stderr。驼鹿文件可能位于/usr/lib64/...中,或者可能位于某些完全奇怪的位置,例如/usr/local/lib64/...,或者甚至更奇怪,/usr/lib64/uniscan/lib/Moose/...。但是,这现在告诉我们我们想要重建和安装moose的地方

注意:正如您可能已经注意到的那样,我的原始答案已被编辑[迂腐]用于语法,但是,实质上取代了我使用find的建议[我没有&#39; t赞成]。

无论如何,要匹配cpanstrace的内容。当您使用cpan时,它可能已经在&#34;安装到$HOME/...&#34;模式,其中,IIRC是默认值。因此,如果是这种情况(即检查MyConfig.pm),您可能会在主目录下找到更新的包,而不是所需的系统范围目录。因此,为了帮助验证这一点,请执行find $HOME -name '*Moose*'并查看出现的情况。

因此,根据strace文件名,文件的时间戳应与您执行cpan命令的时间相匹配。但是,我打赌他们不会赢。

$HOME/.cpan下,有一个子目录$HOME/.cpan/build。这是cpan命令下载和存储包文件的位置。它还在那里构建包。如果您对cpan的调用涉及Moose,则应该有一些*Moose*个文件和目录。

每当我有一个&#34;坏&#34;包,IIRC,我刚从$HOME/.cpan/build(以及一些依赖包)中删除它,然后再次install。事情得到重新下载,重建和重新安装。

strace我们现在知道使用了哪个perl解释器(可能是/usr/bin/perl),它从中获取了moose文件。驼鹿文件应位于@INC目录之一下。如果是的话,很好。如果没有,这意味着&#34;包装&#34; uniscan的脚本正在为Moose建立一条非标准路径,这就是做这个问题的原因:确认与否。

然后,如果需要,请修复MyConfig.pm。如果缺少sudo,那可能就是您所需要的。然后,只需install Moose

如果您愿意,可以先删除$HOME/.cpan/build

答案 1 :(得分:2)

一个简单的cpan -r为我解决了这个问题。运行花了几十分钟。

克雷格·埃斯蒂(Craig Estey)的accepted answer中已经暗示了这一点,但也许有些读者想试一试,并在等待完成时详细了解其方式和原因。