建構 PHP 5.3.3 時與 OpenSSL 相關的連結器錯誤
在嘗試在啟用 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 問題。