Пытаясь собрать PHP 5.3.3 на Debian jessie (спасите себя, не спрашивая почему) с включенным расширением OpenSSL, я столкнулся с undefined reference to symbol 'X509_free@@OPENSSL_1.0.0'
на этапе связывания Makefile и не мог понять, почему (libssl-dev
присутствует и libssl.so
содержит запрошенный символ). Я попытался собрать официальный пакет Debian, который был включен в Debian squeeze, используя pbuilder
chroot-окружение, содержащее Debian jessie и, следовательно, более новые библиотеки (например, OpenSSL 1.0.1 вместо 0.9.8). Я подтвердил, что 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/
), которую я уже решил с помощью символических ссылок, мне пришлось исправить ошибку, которую только что сгенерированный скрипт configure сделал в среде chroot. Вне среды chroot я не стал воссоздавать скрипт настройки через ./buildconf --force
и этот оригинальный сценарий работает нормально. Но пакет Debian пытается поступить правильно и воссоздает скрипт настройки таким образом перед его вызовом. К сожалению, вновь созданный скрипт конфигурации сильно отличается от исходного и ошибочно определяет, что в libcrypto.so отсутствует символ DSA_get_default_method
и поэтому не добавляет -lcrypto
к EXTRA_LIBS
переменная внутри Makefile. Вот почему связывание не удается. Исходный сценарий configure выполняет примерно такой же тест с той же библиотекой, но правильно определяет, что символ присутствует, поэтому связывание с исходным сценарием configure проходит успешно. Я предполагаю, что это связано с разными версиями autoconf (PHP 5.3.3 требует как минимум 2,63, а jessie - 2,69), но я не пытался копать глубже, потому что мне уже надоело.
Вместо этого я просто отредактировал Make-файлы, созданные сломанным скриптом настройки, через sed
и добавил недостающий -lcrypto
назад к EXTRA_LIBS
переменная. Сборка прошла успешно, и полученный PHP связан с OpenSSL 1.0.1 и может успешно открывать SSL-соединения. Если вы попробуете это сами, и ваш сервер взорвется, не обвиняйте меня - это всего лишь взлом, и правильным решением будет выяснить проблему autoconf.