PHP 5.6 libicui18n (libicuuc) not found, required by intl.so и другие проблемы

archive view archive save

freebsd-logo.jpg Ох уж эти обновления... Сервант на FreeBSD 12, PHP 5.6.хх под старые версии движков и скриптов компилировался врукопашную. После сборки проверялись все файлы PHP ошибок и всё было гуд, но спустя год в журнал ошибок стало сыпать: "libicui18n.so.68 not found, required by intl.so"; "libicuuc.so.68 not found, required by intl.so".

Вероятно данный глюкодром связан с обновлением библиотек. Получилось сборка привязана к старым версиям "libicui18n.so.68" и "libicuuc.so.68", вместо которых уже стоят "libicui18n.so.69" и "libicuuc.so.69".

ICU версии 6.9 соберём отдельно врукопашную по отдельному адресу, из которого intl.so в дальнейшем будет подключать "libicui18n.so.69" и "libicuuc.so.69" - таким образом стабилизируем версию и лишим себя подобных геморроев в будущем...

PHP 5.6 libicui18n.so.68 not found, required by intl.so

[28-Dec-2021 04:00:58 Europe/Kiev] PHP Warning: PHP Startup: Unable to load dynamic library "/opt/php56/lib/php/20131226/intl.so" - Shared object "libicui18n.so.68" not found, required by "intl.so" in Unknown on line 0

intl.so компилировался в начале года вместе с PHP 5.6:

$ ls -la /opt/php56/lib/php/20131226/intl.so
-rwxr-xr-x 1 root wheel 611064 Feb 7 2021 /opt/php56/lib/php/20131226/intl.so

с тех пор система FreeBSD неоднократно обновлялась, вероятно также обновился и libicui18n.so.68 до libicui18n.so.69

$ locate libicui18n.so
/usr/local/lib/libicui18n.so.69
/usr/local/lib/libicui18n.so.69.1
 
$ ls -la /usr/local/lib/libicui18n.so.69
lrwxr-xr-x 1 root wheel 18 Jul 6 04:36 /usr/local/lib/libicui18n.so.69 -> libicui18n.so.69.1

Пробуем заново пересобрать intl.so:

$ cd /opt/src/php-5.6.40/ext/intl
$ make clean
$ /opt/php56/bin/phpize
 
$ ./configure CC=gcc48 CXX=gcc48 CPPFLAGS+=" -DU_USING_ICU_NAMESPACE=1" CXXFLAGS="-std=c++11" --prefix=/opt/php56 --with-php-config=/opt/php56/bin/php-config
...
checking whether to enable internationalization support... yes, shared
checking for icu-config... /usr/local/bin/icu-config
checking for location of ICU headers and libraries... /usr/local
checking for ICU 4.0 or greater... found 69.1
checking whether we are using the GNU C++ compiler... yes
...
 
$ make
/bin/sh /opt/src/php-5.6.40/ext/intl/libtool --mode=install cp ./intl.la /opt/src/php-5.6.40/ext/intl/modules
cp ./.libs/intl.so /opt/src/php-5.6.40/ext/intl/modules/intl.so
cp ./.libs/intl.lai /opt/src/php-5.6.40/ext/intl/modules/intl.la
libtool: install: warning: remember to run "libtool --finish /opt/src/php-5.6.40/modules"
 
Build complete.
Don`t forget to run "make test".
 
$ make install
Installing shared extensions: /opt/php56/lib/php/20131226/
$ ls -la /opt/php56/lib/php/20131226/intl.so
-rwxr-xr-x 1 root wheel 611064 Dec 28 04:14 /opt/php56/lib/php/20131226/intl.so

Перекомпиляция не решила проблему, пробуем сделать ссылку:

$ ln -sf /usr/local/lib/libicui18n.so.69 /usr/local/lib/libicui18n.so.68
$ ls -la /usr/local/lib/libicui18n.so.68
lrwxr-xr-x 1 root wheel 31 Dec 28 04:39 /usr/local/lib/libicui18n.so.68 -> /usr/local/lib/libicui18n.so.69

libicuuc.so.68 not found, required by intl.so

Здрасьте новый геморрой:

[28-Dec-2021 04:40:44 Europe/Kiev] PHP Warning: PHP Startup: Unable to load dynamic library "/opt/php56/lib/php/20131226/intl.so" - Shared object "libicuuc.so.68" not found, required by "intl.so" in Unknown on line 0
 
$ locate libicuuc.so
/usr/local/lib/libicuuc.so
/usr/local/lib/libicuuc.so.69
/usr/local/lib/libicuuc.so.69.1
 
$ ls -la /usr/local/lib/libicuuc.so
lrwxr-xr-x 1 root wheel 16 Jul 6 04:36 /usr/local/lib/libicuuc.so -> libicuuc.so.69.1

Пробуем создать ссылки, но проблему это не решает:

$ ln -sf /usr/local/lib/libicuuc.so.69.1 /usr/local/lib/libicuuc.so.68
$ ln -sf /usr/local/lib/libicuuc.so.69.1 /usr/lib/libicuuc.so.68

Удаляем ссылки

$ rm -rf /usr/local/lib/libicui18n.so.68
$ rm -rf /usr/local/lib/libicuuc.so.68
$ rm -rf /usr/lib/libicuuc.so.68

Пробеум снова пересобрать предварительно обновив кэш установленных библиотек

$ ldconfig
$ make clean
$ /opt/php56/bin/phpize
$ ./configure CC=gcc48 CXX=gcc48 CPPFLAGS+=" -DU_USING_ICU_NAMESPACE=1" CXXFLAGS="-std=c++11" --prefix=/opt/php56 --with-php-config=/opt/php56/bin/php-config
 
$ make
...
/opt/src/php-5.6.40/ext/intl/collator/collator_sort.c:538:26: error: "FALSE" undeclared (first use in this function)
 collator_sort_internal( FALSE, INTERNAL_FUNCTION_PARAM_PASSTHRU );
 ^
*** Error code 1
 
Stop.
make: stopped in /opt/src/php-5.6.40/ext/intl

Твою нихай:

$ make clean
$ /opt/php56/bin/phpize
$ ./configure CC=gcc48 CXX=gcc48 CPPFLAGS+=" -DU_USING_ICU_NAMESPACE=1 -DU_DEFINE_FALSE_AND_TRUE=1" CXXFLAGS=" -std=c++11" --prefix=/opt/php56 --with-php-config=/opt/php56/bin/php-config
$ make
...
/usr/local/bin/ld: /usr/local/lib/libicuuc.a(ucol_swp.ao): relocation R_X86_64_32 against ".rodata.str1.1" can not be used when making a shared object; recompile with -fPIC
collect2: error: ld returned 1 exit status
*** Error code 1
 
Stop.
make: stopped in /opt/src/php-5.6.40/ext/intl

ld: libicuuc.a can not be used when making a shared object; recompile with -fPIC

Усратца можно:

$ cd /opt/src
$ wget https://github.com/unicode-org/icu/releases/download/release-69-1/icu4c-69_1-src.tgz
$ tar -xf icu4c-69_1-src.tgz
$ cd icu/source
$ ./configure \
 --prefix=/opt/icu69 \
 --sysconfdir=/etc \
 --mandir=/usr/share/man \
 --sbindir=/usr/bin
$ make -j 8
...
make: Fatal errors encountered -- cannot continue
make: stopped in /opt/src/icu/source
too old or test failed - try upgrading GNU Make
C++ apps may want to build with CXXFLAGS = -std=c++11
** Note: Python not found. You will not be able to build data from source or run tests.

Зашыбись - "Python not found", но питонов у нас хоть куда:

$ locate python|grep bin
/usr/local/bin/python2.7
/usr/local/bin/python2.7-config
/usr/local/bin/python3.7
/usr/local/bin/python3.7-config
/usr/local/bin/python3.7m
/usr/local/bin/python3.7m-config
/usr/local/bin/python3.8
/usr/local/bin/python3.8-config

Переменные из make.conf читать не хочет:

$ cp /usr/share/examples/etc/make.conf /etc
$ vi /etc/make.conf
...
#DEFAULT_VERSIONS=python=2.7 python2=2.7 python3=3.8
#PYTHON_DEFAULT_VERSION=python2.7

Поковырявшись в ./configure видим пробы использовать, переменную PYTHON - добавляем к строке конфигурации:

$ ./configure CC=gcc48 CXX=gcc48 CXXFLAGS=" -std=c++11" --prefix=/opt/icu69 --sysconfdir=/etc --mandir=/usr/share/man --sbindir=/usr/bin PYTHON=/usr/local/bin/python2.7
...
Not rebuilding data/rules.mk, assuming prebuilt data in data/in
Spawning Python to generate test/testdata/rules.mk...
 
ICU for C/C++ 69.1 is ready to be built.
=== Important Notes: ===
Data Packaging: library
 This means: ICU data will be linked with ICU. A shared data library will be built.
 To locate data: ICU will use the linked data library. If linked with the stub library located in stubdata/, the application can use udata_setCommonData() or set a data path to override.
** WARNING: make may not be GNU make.
This may cause ICU to fail to build. Please make sure that GNU make
is in your PATH so that the configure script can detect its location.
checking the version of "make"... make: "/opt/src/icu/source/config/gmakever.mk" line 11: Missing dependency operator

"make" - это тебе не "gmake", падла...

$ pkg install gmake
$ make clean
$ gmake clean
$ ./configure CXXFLAGS=" -std=c++11" --prefix=/opt/icu69 --sysconfdir=/etc --mandir=/usr/share/man --sbindir=/usr/bin PYTHON=/usr/local/bin/python2.7
...
Not rebuilding data/rules.mk, assuming prebuilt data in data/in
Spawning Python to generate test/testdata/rules.mk...
 
ICU for C/C++ 69.1 is ready to be built.
=== Important Notes: ===
Data Packaging: library
 This means: ICU data will be linked with ICU. A shared data library will be built.
 To locate data: ICU will use the linked data library. If linked with the stub library located in stubdata/, the application can use udata_setCommonData() or set a data path to override.
Building ICU: Use a GNU make such as /usr/local/bin/gmake to build ICU.
checking the version of "/usr/local/bin/gmake"... 4.3 (we wanted at least 3.80)
ok
 
$ gmake -j 8
...
clang++ -std=c++11 -W -Wall -pedantic -Wpointer-arith -Wwrite-strings -Wno-long-long  -Qunused-arguments -Wno-parentheses-equality   -o icucal uprint.o cal.o -L../../lib -licui18n -L../../lib -licuuc -L../../stubdata -licudata -lpthread -lm
gmake[2]: Leaving directory "/opt/src/icu/source/samples/cal"
gmake[2]: Entering directory "/opt/src/icu/source/samples"
gmake[2]: Nothing to be done for "all-local".
gmake[2]: Leaving directory "/opt/src/icu/source/samples"
gmake[1]: Leaving directory "/opt/src/icu/source/samples"
gmake[0]: Making all in test
gmake[1]: Entering directory "/opt/src/icu/source/test"
gmake[1]: Nothing to be done for "all".
gmake[1]: Leaving directory "/opt/src/icu/source/test"
gmake[1]: Entering directory "/opt/src/icu/source"
Note: rebuild with "gmake VERBOSE=1 all-local" to show all compiler parameters.
gmake[1]: Leaving directory "/opt/src/icu/source"
$

Ну слава яйцам:

$ gmake install
...
/usr/bin/install -c -m 644 ./config/pkgdata.inc /opt/icu69/lib/icu/69.1/pkgdata.inc
cd /opt/icu69/lib/icu/69.1/..; \
    rm -rf current && ln -s 69.1 current; \
    rm -f Makefile.inc && ln -s current/Makefile.inc Makefile.inc; \
    rm -f pkgdata.inc && ln -s current/pkgdata.inc pkgdata.inc
/bin/sh ./mkinstalldirs /usr/share/man/man1
/usr/bin/install -c -m 644 config/icu-config.1 /usr/share/man/man1

Вернёмся к нашим баранам:

$ make clean
$ /opt/php56/bin/phpize
$ ./configure CC=gcc48 CXX=gcc48 CPPFLAGS+=" -DU_USING_ICU_NAMESPACE=1 -DU_DEFINE_FALSE_AND_TRUE=1" CXXFLAGS="-std=c++11" --prefix=/opt/php56 --with-php-config=/opt/php56/bin/php-config --with-icu-dir=/opt/icu69

Забэкапим старое intl.so

$ ls -la /opt/php56/lib/php/20131226/intl.so
-rwxr-xr-x  1 root  wheel  611064 Dec 28 04:14 /opt/php56/lib/php/20131226/intl.so
$ mv /opt/php56/lib/php/20131226/intl.so /opt/php56/lib/php/20131226/intl.so.bak

С вручную пересобраным icu69 новый intl.so получился в два раза "толще" по размеру:

$ make install
Installing shared extensions:     /opt/php56/lib/php/20131226/
$ ls -la /opt/php56/lib/php/20131226/intl.so
-rwxr-xr-x  1 root  wheel  1753624 Dec 28 07:50 /opt/php56/lib/php/20131226/intl.so

Перезапустим сервант, проверим файл ошибок РНР - ошибок нет, Аллилуйя!


Об авторе
Иван Шаман
Меня нет ни в Инстаграмме ни в Фейсбуке, я просто хожу по улицам и рассказываю первым встречным: сколько зарабатываю; с кем дружу; где живу и чем дышу. У меня даже появилось несколько подписчиков: ПСИХоЛОХ и участковый полицай!
Ещё статьи автора

Добавить комментарий

АХТУНГ! Все комменты гостей модерасятся модерастом.
  1. Мессаги исключительно рекламного содержания, либо содержащие только одни оценочные суждения типа "круто" ("отлично", "спасибо", "автор дебил" и т.п.) не публикуются;
  2. Злостным спамерам, пранкерам и прочей сетевой нечисти рекомендуем напрасно не тратить своего времени и удовлетворять свои больные фантазии на специализированных Интернет ресурсах!;
  3. Разумная обоснованная критика, замечания, дополнения приветствуются. Поля помеченные символом * обязательны к заполнению.


Защитный код
Обновить

Нет комментариев

Вы можете стать первым, кто добавит комментарий к этой записи.

Комментарии в блоге
Новое на форуме