在尝试在启用 OpenSSL 扩展的 Debian jessie 上构建 PHP 5.3.3 时(不问原因,节省一些理智),我undefined reference to symbol 'X509_free@@OPENSSL_1.0.0'
在 Makefile 的链接步骤中遇到,无法弄清楚为什么 (libssl-dev
存在并libssl.so
包含请求的符号)。我尝试使用pbuilder
包含 Debian jessie 以及更新的库(如 OpenSSL 1.0.1 而不是 0.9.8)的基于 chroot 的环境构建 Debian 挤压中包含的官方 Debian 软件包。我确认 PHP 5.3.3 与 OpenSSL 1.0.1 兼容,方法是在 chroot 环境之外使用./configure --disable-all --with-openssl=/usr; make
. 生成的 CGI 和 CLI 二进制文件确实与 OpenSSL 相关联,这可以通过ldd sapi/cli/php
. 然而在 chroot 环境中,它失败了。
不要打扰,我已经找出了大部分原因和解决方法/黑客来实现成功的构建。
除了使 libssl.so 和 libcrypto.so 在正确的位置(
/usr/lib/
而不是/usr/lib/x86_64-linux-gnu/
)可用,我已经通过符号链接解决了这个问题,我不得不解决新生成的配置脚本在 chroot 环境中所犯的错误。在 chroot 环境之外,我没有费心通过重新创建配置脚本,./buildconf --force
并且这个原始脚本工作正常。但是 Debian 软件包试图做正确的事情,并在调用之前以这种方式重新创建配置脚本。不幸的是,新创建的配置脚本与原来的有很大不同,并错误地确定 libcrypto.so 缺少该符号DSA_get_default_method
,因此没有添加-lcrypto
到EXTRA_LIBS
Makefile 中的变量。这就是链接失败的原因。原始配置脚本使用相同的库进行大致相同的测试,但正确确定符号存在,这就是原始配置脚本链接成功的原因。我认为这与不同的 autoconf 版本有关(PHP 5.3.3 至少需要 2.63,但 jessie 有 2.69),但我没有尝试深入挖掘,因为我已经受够了。相反,我只是编辑了由损坏的配置脚本创建的 Makefile
sed
,并将丢失的内容添加-lcrypto
回EXTRA_LIBS
变量中。构建成功,生成的 PHP 链接到 OpenSSL 1.0.1,并且可以成功打开 SSL 连接。如果你自己尝试这个并且你的服务器爆炸了,不要怪我——这只是一个 hack,正确的解决方案是找出 autoconf 问题。