PHP, GD, libxml [РЕШЕНО]

Добрый день, возникла проблема после обновления gd.
После него мои 2 Apache (один с PHP 5.2.17, другой с PHP 5.3.15) перестали запускаться, выдавая ошибку
./apachectl: line 78:  3268 Ошибка сегментирования                   (core dumped) $HTTPD $ARGV
При отключении модуля PHP, удалением строки
LoadModule php5_module        modules/libphp5.so
из httpd.conf.
Сразу скажу, что все Apache и PHP собраны из исходников.

Я тогда решил проверить работоспособность интерпритатора, просто, узнав его версию. Оба PHP выдали
./php: error while loading shared libraries: libgd.so.2: cannot open shared object file: No such file or directory

Я решил сначала пересобрать PHP 5.2.17 следующей командой:
./configure --prefix=/usr/local/php5.2/ --with-mysql=/usr/include/mysql --enable-force-cgi-redirect --enable-zend-multibyte --enable-mbstring --enable-zip --with-pdo-mysql --with-curl=/usr --with-mcrypt=/usr --with-apxs2=/usr/local/apache2php5.2/bin/apxs --with-zlib=/usr --with-gd --with-gdbm --enable-sockets --with-mysqli=/usr/bin/mysql_config --with-gd=/usr --enable-soap

в процессе компиляции вылазит такая ошибка:
/home/$username$/Downloads/php-5.2.17/ext/dom/node.c: В функции «dom_canonicalization»:
/home/$username$/Downloads/php-5.2.17/ext/dom/node.c:1953:21: ошибка: доступ по указателю на неполный тип
    ret = buf->buffer->use;
                     ^
In file included from /home/$username$/Downloads/php-5.2.17/main/php.h:38:0,
                 from /home/$username$/Downloads/php-5.2.17/ext/dom/node.c:26:
/home/$username$/Downloads/php-5.2.17/ext/dom/node.c:1955:40: ошибка: доступ по указателю на неполный тип
     RETVAL_STRINGL((char *) buf->buffer->content, ret, 1);
                                        ^
/home/$username$/Downloads/php-5.2.17/Zend/zend_API.h:472:14: замечание: in definition of macro «ZVAL_STRINGL»
   char *__s=(s); int __l=l;  \
              ^
/home/$username$/Downloads/php-5.2.17/ext/dom/node.c:1955:5: замечание: in expansion of macro «RETVAL_STRINGL»
     RETVAL_STRINGL((char *) buf->buffer->content, ret, 1);
     ^
make: *** [ext/dom/node.lo] Ошибка 1

С PHP 5.3.15 все то же самое. Естесственно, я его ставлю по другим путям и прикрепляю к другому Apache. После я решил установить PHP 5.3.27 (крик отчаяния). Его конфигурировал я так:
./configure --prefix=/usr/local/php/ --with-mysql=/usr/include/mysql  --enable-mbstring  --with-pdo-mysql --with-curl=/usr --with-mcrypt=/usr --with-apxs2=/usr/local/apache2/bin/apxs --with-zlib=/usr --with-gd --with-gdbm --enable-sockets --with-mysqli=/usr/bin/mysql_config --with-gd=/usr
Который выдает
ext/gd/.libs/gd.o: In function `zif_imageloadfont':
/home/$username$/Downloads/php-5.3.27/ext/gd/gd.c:1528: undefined reference to `overflow2'
/home/$username$/Downloads/php-5.3.27/ext/gd/gd.c:1534: undefined reference to `overflow2'
ext/gd/.libs/gd.o: In function `_php_image_type':
/home/$username$/Downloads/php-5.3.27/ext/gd/gd.c:2266: undefined reference to `gdGetC'
/home/$username$/Downloads/php-5.3.27/ext/gd/gd.c:2266: undefined reference to `getmbi'
/home/$username$/Downloads/php-5.3.27/ext/gd/gd.c:2266: undefined reference to `skipheader'
collect2: error: ld returned 1 exit status

Более новые версии не нужны, так как есть проекты на поддержке, у которых битрикс написан на php 5.2 и php 5.3
Откатите GD, делов то.
Как? О_о
Ничего сложного https://wiki.archlinux.org/index.php/Downgrading_Packages_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)
И после отката не забудьте добавить gd в IgnorePkg в файле /etc/pacman.conf чтобы он обратно не обновился.
А вообще ничего, что gd собран под php 5.4 ? Вы тогда и gd компилируйте.
И пора отказываься от php 5.3 - он же уже устарел. Даже на debian стоит 5.4

И, если уж сами компилируете, то и зависимости проверяйте. От версии пакетов тоже многое зависит.

P.S. Столкнулся с PHP 5.2 на паре зарубежных хостингов (в Америке).
ПО (на 5.4) не работает.
При этом задекларирован 5.4.
Протестировал - ан нет - 5.2!
Б... руки бы поотрывал.
Я сам знаю, что надо отказываться. По мне так и от PHP надо отказываться) Но есть проекты, которые работают на старом PHP. CMS c того времени, обновлялась, но на проекте ее не обновляли, потому что при ее обновлении всегда что-нибудь "отваливается". А чтоб контролировать, что "отвалилось", надо писать тесты. А тесты не пишутся, потому что клиент не готов платить за них, вот так и живем. И прекрасно знаем, что надо жить по-другому, но временно придется пожить так.
Речь идет не о пакете php-gd, а он gd. Про php-gd я узнал только на днях, что есть такой пакет. Разница, наверное, что один для php, а другой для C++ или С. В общем мне откат не помог, кстати(
Видимо надо копать в сторону libxml.
В общем в который раз работает пословица "спасение утопающего – дело рук самого утопающего".
В общем порыскав интернет капитально, нашел, что проблема в libxml при компиляции не у меня одного и достаточно "свежая".
В общем надо немного подправить исходники PHP 5.2 вот так:
diff --git a/ext/dom/documenttype.c b/ext/dom/documenttype.c
 index d61ba79..eee3b5f 100644
 --- a/ext/dom/documenttype.c
 +++ b/ext/dom/documenttype.c
 @@ -205,7 +205,11 @@ int dom_documenttype_internal_subset_read(dom_object *obj, zval **retval TSRMLS_
                 if (buff != NULL) {
                         xmlNodeDumpOutput (buff, NULL, (xmlNodePtr) intsubset, 0, 0, NULL);
                         xmlOutputBufferFlush(buff);
 +#ifdef LIBXML2_NEW_BUFFER
 +                       ZVAL_STRINGL(*retval, xmlOutputBufferGetContent(buff), xmlOutputBufferGetSize(buff), 1);
 +#else
                         ZVAL_STRINGL(*retval, buff->buffer->content, buff->buffer->use, 1);
 +#endif
                         (void)xmlOutputBufferClose(buff);
                         return SUCCESS;
                 }
 diff --git a/ext/dom/node.c b/ext/dom/node.c
 index 5bcb234..727d1bc 100644
 --- a/ext/dom/node.c
 +++ b/ext/dom/node.c
 @@ -1895,9 +1895,17 @@ static void dom_canonicalization(INTERNAL_FUNCTION_PARAMETERS, int mode) /* {{{
          RETVAL_FALSE;
      } else {
                 if (mode == 0) {
 +#ifdef LIBXML2_NEW_BUFFER
 +                       ret = xmlOutputBufferGetSize(buf);
 +#else
                         ret = buf->buffer->use;
 +#endif
                         if (ret > 0) {
 +#ifdef LIBXML2_NEW_BUFFER
 +                               RETVAL_STRINGL((char *) xmlOutputBufferGetContent(buf), ret, 1);
 +#else
                                 RETVAL_STRINGL((char *) buf->buffer->content, ret, 1);
 +#endif
                         } else {
                                 RETVAL_EMPTY_STRING();
                         }
 diff --git a/ext/simplexml/simplexml.c b/ext/simplexml/simplexml.c
 index a379111..2368596 100644
 --- a/ext/simplexml/simplexml.c
 +++ b/ext/simplexml/simplexml.c
 @@ -1387,7 +1387,11 @@ SXE_METHOD(asXML)
                         xmlNodeDumpOutput(outbuf, (xmlDocPtr) sxe->document->ptr, node, 0, 0, ((xmlDocPtr) sxe->document->ptr)->encoding);
                         xmlOutputBufferFlush(outbuf);
 +#ifdef LIBXML2_NEW_BUFFER
 +                       RETVAL_STRINGL((char *)xmlOutputBufferGetContent(outbuf), xmlOutputBufferGetSize(outbuf), 1);
 +#else
                         RETVAL_STRINGL((char *)outbuf->buffer->content, outbuf->buffer->use, 1);
 +#endif
                         xmlOutputBufferClose(outbuf);
                 }
         } else {
 
Зарегистрироваться или войдите чтобы оставить сообщение.