创建共享库的链接

创建共享库的链接

我有一个库( 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

现在可以了!

相关内容