我有一个库( ZendDebugger.so ),它又需要 openssl 库,但它找不到对它的引用。
事实上,当 ZendDebugger.so 加载时,它会在错误日志上打印此错误(在我的例子中是 Apache error_log 文件):
Failed loading /usr/lib64/php/7.1/modules/ZendDebugger.so:
libssl.so.1.0.0: cannot open shared object file:
No such file or directory
然后我尝试安装 openssl:
sudo yum install openssl
Loaded plugins: priorities, update-motd, upgrade-helper
amzn-main | 2.1 kB 00:00:00
amzn-updates | 2.3 kB 00:00:00
Package 1:openssl-1.0.1k-15.99.amzn1.x86_64 already installed and latest version
Nothing to do
看起来已经安装了自定义 openssl,在本例中是亚马逊版本。所以我可能想做类似的事情:
cd /usr/lib64
ln /path/to/amazon/openssl/openssl-1.0.1k-15.99.amzn1.x86_64.so libssl.so
通过这种方式,我将创建一个由 ZendDebugger.so 自动看到的共享库,因为它将在 /usr/lib64 中创建,这是可执行文件查找其库的默认目录之一。
但在此之前,我需要知道 openssl-1.0.1k-15.99.amzn1.x86_64 文件的路径:
sudo find / openssl-1.0.1k-15.99.amzn1.x86_64
....
....
find: `openssl-1.0.1k-15.99.amzn1.x86_64': No such file or directory
我缺少什么?我如何找到 Amazon openssl 的路径?或者您还有其他解决方案吗?谢谢
答案1
RPM 总是分为不同的关注领域。它们通常被命名为:
<pkg>.<arch>
<pkg>-devel.<arch>
<pkg>-libs.<arch>
哪里<pkg>
将会是openssl
并且<arch>
将会i686
或者x86_64
。还有其他架构,但这些是 AMD/Intel 硬件上的常见架构,因此我们将仅讨论这些架构。
构成该软件的实际工具openssl
包含在 RPM 中openssl.x86_64
。请注意此 RPM 的名称如何符合我上面显示的模式?
库 (.so) 在此 RPM 中,openssl-libs.x86_64
而头文件 (.h) 在此 RPM 中openssl-devel.x86_64
。
因此,您的问题是您尚未实际安装库或头文件,以便您的包可以编译并链接到该openssl
包。
尝试这个:
$ yum search openssl | grep ^openssl
openssl-devel.i686 : Files for development of applications which will use
openssl-devel.x86_64 : Files for development of applications which will use
openssl-perl.x86_64 : Perl scripts provided with OpenSSL
openssl-pkcs11.x86_64 : A PKCS#11 engine for use with OpenSSL
openssl-static.i686 : Libraries for static linking of applications which will
openssl-static.x86_64 : Libraries for static linking of applications which will
openssl.x86_64 : Utilities from the general purpose cryptography library with
openssl-libs.x86_64 : A general purpose cryptography library with TLS
openssl-libs.i686 : A general purpose cryptography library with TLS
openssl098e.i686 : A compatibility version of a general cryptography and TLS
openssl098e.x86_64 : A compatibility version of a general cryptography and TLS
现在安装它们:
$ sudo yum install -y openssl-{devel,libs}
安装后,您可以确认 RPM 的内容openssl-libs
:
$ rpm -ql openssl-libs | grep libssl.so
/usr/lib64/.libssl.so.1.0.2k.hmac
/usr/lib64/.libssl.so.10.hmac
/usr/lib64/libssl.so.1.0.2k
/usr/lib64/libssl.so.10
如果我不知道要安装什么 RPM 怎么办?
这是我经常看到的一个常见问题。大多数刚接触 Redhat 发行版(例如 Fedora/CentOS/RHEL)的人都不知道repoquery
命令行工具。使用此工具,您可以查询远程 YUM 存储库并查找哪些包提供给定文件。
所以在你的场景中:
$ repoquery -qf */libssl.so*
openssl-libs-1:1.0.2k-12.el7.x86_64
openssl-devel-1:1.0.2k-12.el7.x86_64
openssl098e-0:0.9.8e-29.el7.centos.3.i686
openssl-libs-1:1.0.2k-12.el7.i686
openssl-devel-1:1.0.2k-12.el7.i686
我们可以看到该libssl.so*
文件包含在上述所有 RPM 中。因此,根据您现有的 RPM,您可能需要以下 2 个:
openssl-libs-1:1.0.2k-12.el7.x86_64
openssl-devel-1:1.0.2k-12.el7.x86_64
笔记:请记住,我向您展示的是 CentOS 7.x 软件包,您使用的是 Amazon 的 AMI,这是他们自己品牌的 CentOS 软件包,因此名称略有不同,但无论如何,我向您展示的过程应该是相同的。
答案2
事实证明,我在 /usr/lib64 中有 libssl 库,只是文件名与 ZendDebugger 期望的不同( libssl.so.1.0.0 )。所以我刚刚使用正确的文件名创建了一个硬链接:
[ec2-user@ip-172-31-4-60 ~] cd /usr/lib64
[ec2-user@ip-172-31-4-60 lib64] ls -la libssl*
-rwxr-xr-x 1 root root 303520 Jun 22 2017 libssl3.so
lrwxrwxrwx 1 root root 16 Sep 20 2017 libssl.so -> libssl.so.1.0.1k
lrwxrwxrwx 1 root root 16 Aug 13 2017 libssl.so.10 -> libssl.so.1.0.1k
-rwxr-xr-x 2 root root 449616 Feb 28 2017 libssl.so.1.0.1k
[ec2-user@ip-172-31-4-60 lib64] sudo ln libssl.so.1.0.1k libssl.so.1.0.0
现在可以了!