Назад | Перейти на главную страницу

Ошибка компоновщика, связанная с OpenSSL, при сборке PHP 5.3.3

Пытаясь собрать 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, используя pbuilderchroot-окружение, содержащее 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.