![构建 PHP 5.3.3 时出现与 OpenSSL 相关的链接器错误](https://linux22.com/image/728570/%E6%9E%84%E5%BB%BA%20PHP%205.3.3%20%E6%97%B6%E5%87%BA%E7%8E%B0%E4%B8%8E%20OpenSSL%20%E7%9B%B8%E5%85%B3%E7%9A%84%E9%93%BE%E6%8E%A5%E5%99%A8%E9%94%99%E8%AF%AF.png)
在启用 OpenSSL 扩展的情况下尝试在 Debian jessie 上构建 PHP 5.3.3(不要问为什么,以免伤神)时,我undefined reference to symbol 'X509_free@@OPENSSL_1.0.0'
在 Makefile 的链接步骤中遇到了问题,无法弄清楚为什么(libssl-dev
存在并libssl.so
包含请求的符号)。我尝试使用基于的 chroot 环境构建包含在 Debian squeeze 中的官方 Debian 软件包,pbuilder
该环境包含 Debian jessie,因此包含较新的库(如 OpenSSL 1.0.1 而不是 0.9.8)。我通过在 chroot 环境之外使用构建它来确认 PHP 5.3.3 与 OpenSSL 1.0.1 兼容./configure --disable-all --with-openssl=/usr; make
。生成的 CGI 和 CLI 二进制文件确实与 OpenSSL 链接,这可以通过确认ldd sapi/cli/php
。但在 chroot 环境中,它失败了。
不用回答,我已经找到了大部分原因,并且找到了解决方法/解决办法以成功构建。
答案1
除了让 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),但我没有尝试深入研究,因为我已经受够了。
相反,我只是通过编辑损坏的 configure 脚本创建的 Makefile,sed
并将缺失的内容重新添加-lcrypto
到变量中EXTRA_LIBS
。构建成功,生成的 PHP 与 OpenSSL 1.0.1 链接,可以成功打开 SSL 连接。如果您自己尝试这样做并且您的服务器崩溃,请不要责怪我 - 这只是一次黑客攻击,正确的解决方案是找出 autoconf 问题。