如何安装单个Perl Crypt :: OpenSSL :: AES以供不同的Linux环境使用

时间:2013-12-17 03:13:01

标签: linux perl openssl cpan

我有一个棘手的问题,我不太确定如何解决。情况如下:

  • 我们有一个常见的32位perl 5.10.0
  • 它被32位和64位linux机器使用

现在的问题是我需要为Perl安装Crypt :: OpenSSL :: AES模块,但是因为它构建了一个共享库,所以会出现很多问题:

  • 如果在64位计算机上构建,则模块不可用于生成的AES的“错误的ELF类:ELFCLASS64”错误。所以
  • 如果在32位机器上构建,则模块在64位上不可用,带有未定义的符号:AES_encrypt

我猜测的问题是不同的机器安装了不同版本的OpenSSL,它们彼此不兼容。

我的问题是我无法更改任何机器配置,我该怎么办才能让AES模块在所有机器上运行?

谢谢!

3 个答案:

答案 0 :(得分:1)

我使用staticperl和构建静态链接的Crypt :: OpenSSL :: AES的组合解决了这个问题,这样我就有一个完全静态链接的perl可执行文件。

鉴于我无法修改环境,这是我能想到的最好的。

答案 1 :(得分:0)

Perl的默认配置非常有意地将特定于平台的东西放在一个单独的目录中;你似乎打破了这个模型。考虑恢复它。

答案 2 :(得分:0)

我假设您在32位机器上构建了perl,因此在构建过程中,Configure不包含任何'make this 32 bit'编译器开关。如果你现在在64位机器上构建,构建过程将使用完全相同的开关,所以你得到一个64位二进制文​​件,不能从32位perl加载 - 即使在64位机器上也是如此,因为32位您在那里运行的perl二进制文件也无法加载64位共享库。

您可以尝试在64位计算机上构建共享perl,明确声明您需要32位perl。应该有一些配置参数。这样,你有一个perl在构建模块时设置“使用32位”编译器标志。然后,您可以在每台机器上使用该版本的perl来构建模块。这些模块将不相同,但每个模块都将按其位大小运行,并且您的软件分发过程可能会在分发到特定计算机时拉出正确的模块。

然而,真正的问题有些落后。我假设你公司的某个人在某个时候说“我们不想依赖于发行版提供的内容,让我们构建我们自己的perl,我们可以随处复制”。这听起来是个好主意,但事实并非如此。不同的Linux版本使用不同版本的共享库,配置文件的默认目录,默认路径变量等。配置过程负责处理并为您的机器创建一个perl二进制文件。如果将其复制到其他计算机,则可能无法在其他版本的共享库中找到符号。它可能会尝试从那里不存在的目录中读取lib。它可能不包含在您构建它的计算机上更正的某些错误的解决方法,但需要在复制它的旧系统上使用解决方法。或者,它可能为在较新系统上长期修复的东西提供解决方法,从而浪费CPU时间。

因此,基本上,如果你构建一个包含所有东西并且不需要任何共享库的静态perl,那么创建一个perl来复制到任何地方只会很好。在一台机器上编译的标准共享库使用perl不符合“我将它复制到任何地方的行为相同”请求你可能有的,因为它太依赖于它周围的东西。