У меня есть библиотека, которой я пользовался успешно с PHP 5.1.6 с помощью некоторого кода обертки, сгенерированного БОЛЬШИМ ГЛОТКОМ (v1.3.40).
Я только что обновил до PHP 5.3.2, и я вижу следующую ошибку:
PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib/php/modules/myLib_php.so' - /usr/lib/php/modules/myLib_php.so: undefined symbol: zend_error_noreturn in Unknown on line 0
На расследовании кажется, что код обертки, произведенный БОЛЬШИМ ГЛОТКОМ (myLib_wrap.c), включает вызовы в функцию PHP: zend_error_noreturn и что эта функция не доступна в PHP 5.3.2?
Кто-либо видел эту проблему прежде? Вещи, кажется, работают, если я вручную обновляю сгенерированный код так, чтобы вместо того, чтобы назвать zend_error_noreturn он просто назвал zend_error. Действительно ли этот подход безопасен?
В PHP недавно было изменение, которое определяло только символ zend_error_noreturn как псевдоним символа для zend_error при сборке с GCC версии 3 или выше, тогда как ранее он также определил символ при использовании GCC 2.
Псевдоним символа - это всего лишь попытка оптимизации в PHP, которая не дает никаких преимуществ, и он действительно должен был быть отброшен тем, кто недавно пересматривал эту часть движка. В других случаях сборки это просто # определяется как zend_error .
Замена вызовов zend_error_noreturn на zend_error безопасна.