powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / (FreeBSD) Как подгружать библиотеку с нужного пути?
15 сообщений из 15, страница 1 из 1
(FreeBSD) Как подгружать библиотеку с нужного пути?
    #39819748
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никогда подобным не занимался с таким "размахом", а вот пришлось...
Если не в тот подфорум написал, прошу модератора перенести куда надо.

Имеется сервер под FreeBSD 12.0, где штатно из портов установлен php 7.2.
Потребовалось дополнительно установить пару более ранних версий, начал с php 5.6.
Скомпилировал ее по самой минималке с --prefix=/usr/local/php56c - работает. Добавляю необходимые опции, дошел до -with-openssl и -with-curl и встрял по полной...

Проблема в том, что php 5.6 не компилируется с openssl версии 1.1.1 (различаются структуры), которая поставляется с фряхой "из коробки". Где-то, кажись в багтрекере php, нашел рекомендацию использовать более старую версию openssl.
Ладно, ставлю дополнительно openssl версии 1.0.2 и так же дополнительно curl с тем же --prefix (curl так же использует библиотеку libssl.so)

Для начала проверяю curl - работает, библиотеки грузятся как надо:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
$ ldd -v /usr/local/php56c/bin/curl 
/usr/local/php56c/bin/curl:
        libcurl.so.4 => /usr/local/php56c/lib/libcurl.so.4 (0x800271000)
        libidn2.so.0 => /usr/local/lib/libidn2.so.0 (0x8002d7000)
        libssl.so.1.0.0 => /usr/local/php56c/lib/libssl.so.1.0.0 (0x8002f9000)
        libcrypto.so.1.0.0 => /usr/local/php56c/lib/libcrypto.so.1.0.0 (0x80036d000)
        libz.so.6 => /lib/libz.so.6 (0x8005c1000)
        libthr.so.3 => /lib/libthr.so.3 (0x8005db000)
        libc.so.7 => /lib/libc.so.7 (0x800606000)
        libunistring.so.2 => /usr/local/lib/libunistring.so.2 (0x8009f9000)



Ладно, едем дальше, конфигурирую php вот таким образом
Код: sql
1.
2.
3.
4.
5.
6.
LDFLAGS="-Wl,-R/usr/local/php56c/lib -L/usr/local/php56c/lib" ./configure  \
.....
--with-curl=/usr/local/php56c \
--with-openssl=/usr/local/php56c \
--prefix=/usr/local/php56c \
....



Если я правильно понял, тут LDFLAGS должна задать приоритетные пути поиска библиотек.

Компиляция успешно, проходит, но при запуске php валится в кору. Разбор показал такие моменты:
libcurl.so грузится из системной директории, а libssl.so грузится дважды - первый раз из php правильно, а второй раз из неправильной libcurl.so
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
$ ldd -a /usr/local/php56c/bin/php
/usr/local/php56c/bin/php:
...
        libssl.so.1.0.0 => /usr/local/php56c/lib/libssl.so.1.0.0 (0x800d4d000)
...
        libcurl.so.4 => /usr/local/lib/libcurl.so.4 (0x8016d0000)
...
/usr/local/lib/libcurl.so.4:
...
        libssl.so.111 => /usr/lib/libssl.so.111 (0x801e30000)
...



Посмотрел в truss - там даже нет попытки поискать libcurl.so в /usr/local/php56c/lib, а подгружается она сразу из /usr/local/lib
Код: sql
1.
2.
3.
4.
close(3)                                         = 0 (0x0)
openat(AT_FDCWD,"/usr/local/lib/libcurl.so.4",O_RDONLY|O_CLOEXEC|O_VERIFY,00) = 3 (0x3)
fstat(3,{ mode=-rwxr-xr-x ,inode=883905,size=562960,blksize=32768 }) = 0 (0x0)
mmap(0x0,4096,PROT_READ,MAP_PRIVATE|MAP_PREFAULT_READ,3,0x0) = 34371100672 (0x800ad6000)



Заглянул в Makefile - там в переменных окружения *_LDFLAGS* оба пути упоминаются, притом, первым всегда идет системный /usr/local/lib, а потом уже мой /usr/local/php56c/lib. Пробовал там тупым редактированием поменять пути местами, но результата оно не дало.

Воооот... Теперь я понимаю, что надо как-то более убедительно уговаривать линковщик. но не понимаю, как именно. Советы, в основном, сводятся к LDFLAGS.

Собственно, вопрос. Как уговорить то?

Тем более, что для libssl.so оно сработало, хотя... там же разная версия библиотеки...
...
Рейтинг: 0 / 0
(FreeBSD) Как подгружать библиотеку с нужного пути?
    #39819772
fandr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkle,

а что в переменной LD_LIBRARY_PATH?
...
Рейтинг: 0 / 0
(FreeBSD) Как подгружать библиотеку с нужного пути?
    #39819818
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fandr,

Установки каких-то явных значений для LD_LIBRARY_PATH не нашел. Каким образом и где посмотреть ее можно?
...
Рейтинг: 0 / 0
(FreeBSD) Как подгружать библиотеку с нужного пути?
    #39819871
fandr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
# echo $LD_LIBRARY_PATH


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
     The shared	libraries which	are found will be automatically	available for
     loading if	needed by the program being prepared for execution.  This
     obviates the need for storing search paths	within the executable.

     The  LD_LIBRARY_PATH  environment variable can be used to override the use
     of	directories (or	the order thereof) from	the cache or to	specify	addi-
     tional directories	where shared libraries might be	found.
     LD_LIBRARY_PATH is	a `:' separated	list of	directory paths	which are
     searched by the dynamic linker when it needs to load a shared library.
     It	can be viewed as the run-time equivalent of the	-L switch of ld(1).


PS: с FreeBSD не работаю, если что 8)
...
Рейтинг: 0 / 0
(FreeBSD) Как подгружать библиотеку с нужного пути?
    #39819894
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изначально LD_LIBRARY_PATH пустая.
Если перед запуском программы (которая в кору падала) установить свою директорию
Код: sql
1.
$ export LD_LIBRARY_PATH=/usr/local/php56c/lib ; ldd -a /usr/local/php56c/bin/php

, тогда загрузка библиотеки правильно происходит.

Это вариант... с большим натягом на самый крайний случай, когда ну ни под каким соусом не получится нормально скомпилировать php.

Меня же интересует в бОльшей мере способ сказать линковщику, чтобы он правильный путь загрузки библиотеки в бинарнике сделал сразу, при сборке.
...
Рейтинг: 0 / 0
(FreeBSD) Как подгружать библиотеку с нужного пути?
    #39819951
fandr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
переменные окружения для того и предназначены, что бы при их помощи все работало без перекомпиляции
как-то странно стремиться к обратному

кстати, правильно делать так:

# export LD_LIBRARY_PATH=/usr/local/php56c/lib:$LD_LIBRARY_PATH
...
Рейтинг: 0 / 0
(FreeBSD) Как подгружать библиотеку с нужного пути?
    #39819992
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы хотите сказать, что компилятору виднее, как собирать программу, а с остальным нехай пользователи трахтибидохаются, устанавливая переменные окружения перед запуском после успешного выпадания в кору? ;-)
Корявенько как-то выходит... Хотя, как вариант, можно и обертку для php сделать, чтобы ручками не ставить LD_LIBRARY_PATH при запуске.

Видимо, действительно, опция конфигурирования
Код: sql
1.
2.
$ ./configure --help | grep curl
  --with-curl=DIR         Include cURL support

вместе с толкованием https://www.php.net/manual/ru/curl.installation.php Для использования cURL необходимо собрать PHP с опцией --with-curl[=DIR] , где DIR - имя каталога, содержащего подкаталоги lib и include. Каталог include должен содержать подкаталог curl с файлами easy.h и curl.h. В каталоге lib должен быть файл libcurl.a. не имеет никакого отношения к путям загрузки курловой библиотеки. По крайней мере, libcurl.so там не требуется.
...
Рейтинг: 0 / 0
(FreeBSD) Как подгружать библиотеку с нужного пути?
    #39820130
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Залез (немытыми руками, конечно) в Makefile.

Было:

BUILD_CGI = $(LIBTOOL) --mode=link $(CC) -export-dynamic $(CFLAGS_CLEAN) $(EXTRA_CFLAGS) $(EXTRA_LDFLAGS_PROGRAM) $(LDFLAGS) $(PHP_RPATHS) $(PHP_GLOBAL_OBJS) $(PHP_BINARY_OBJS) $(PHP_CGI_OBJS) $(EXTRA_LIBS) $(ZEND_EXTRA_LIBS) -o $(SAPI_CGI_PATH)

Стало:

BUILD_CGI = $(LIBTOOL) --mode=link $(CC) -export-dynamic $(CFLAGS_CLEAN) -L/usr/local/php56c/lib -R /usr/local/php56c/lib $(PHP_GLOBAL_OBJS) $(PHP_BINARY_OBJS) $(PHP_CGI_OBJS) $(EXTRA_LIBS) $(ZEND_EXTRA_LIBS) -o $(SAPI_CGI_PATH)

Аналогично и для BUILD_CLI и BUILD_FPM поправил.
По крайней мере, так без бубна ldd кажет правильный путь загрузки и php в кору не падает.

Понимаю, что так оно работает...
А если по хорошему делать - то править configure следует или... как это более правильно делается?
Ну, на случай, если в будущем придется с какими-то другими опциями пересобрать.
...
Рейтинг: 0 / 0
(FreeBSD) Как подгружать библиотеку с нужного пути?
    #39820213
Фотография bga83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkleИмеется сервер под FreeBSD 12.0, где штатно из портов установлен php 7.2.
Потребовалось дополнительно установить пару более ранних версий, начал с php 5.6.
Скомпилировал ее по а впакетах нужной версии нет, чтобы не мучаться с ручной сборкой?
...
Рейтинг: 0 / 0
(FreeBSD) Как подгружать библиотеку с нужного пути?
    #39820244
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bga83а впакетах нужной версии нет, чтобы не мучаться с ручной сборкой?В пакетах не глядел. Из портов выкинули 5.6 не так давно. И там ещё где-то в шатных мейкфайлах особенность есть, что можно поставить одну из трех доступных версий PHP, а две конфликтуют, так как файлы на одни и те же пути ставятся под одними именами. Пакеты обычно мало чем отличаются, ну, только что минорная версия постарее будет.
...
Рейтинг: 0 / 0
(FreeBSD) Как подгружать библиотеку с нужного пути?
    #39820252
Фотография bga83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vklebga83а впакетах нужной версии нет, чтобы не мучаться с ручной сборкой?В пакетах не глядел. Из портов выкинули 5.6 не так давно. И там ещё где-то в шатных мейкфайлах особенность есть, что можно поставить одну из трех доступных версий PHP, а две конфликтуют, так как файлы на одни и те же пути ставятся под одними именами. Пакеты обычно мало чем отличаются, ну, только что минорная версия постарее будет.
еще есть вариант с модулями наподобие https://lmod.readthedocs.io/en/latest/ но я не уверен наличия подобного решения под FreeBSD, в линуксах точно работает. С фряхой давно уже дела не имел

с lmod или аналогами хоть десяток версий одного и того же софта ставить можно. идея заключается в том что они раскладывают по разным папкам и при необходимости работать с определенной версией софтины автоматом проставляются все переменные окружения
...
Рейтинг: 0 / 0
(FreeBSD) Как подгружать библиотеку с нужного пути?
    #39820265
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bga83еще есть вариант с модулями наподобие https://lmod.readthedocs.io/en/latest/ но я не уверен наличия подобного решения под FreeBSDЗанятная штука, но нету. Докер, насколько помню, пока в состоянии экспериментов, да и требования к типу ФС предъявляет.
Потому по совокупности было выбрано решение собрать нужные вручную из исходников. Оно не вполне просто, конечно.
...
Рейтинг: 0 / 0
(FreeBSD) Как подгружать библиотеку с нужного пути?
    #39820282
Фотография Scott Tiger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkleВы хотите сказать, что компилятору виднее, как собирать программу, а с остальным нехай пользователи трахтибидохаются, устанавливая переменные окружения перед запуском после успешного выпадания в кору? ;-)

В целом - да, хотя это не компилятор, а компоновщик (линкер) задействован. Вы же собираете своё похапе и его зависимости с динамической компоновкой и без указания rpath, поэтому при запуске динамический компоновщик подгрузит библиотеку исходя из своих умолчаний, определяемых, в том числе, и переменными окружения.
Вариантов несколько:

1. Оставить как есть будет самый правильный вариант. Пользователь программы обязан знать, какие библиотеки программе нужны, где их можно взять и уметь прочитать man rtld
2. Задать rpath при сборке (опции gcc -Wl,-rpath,../path/to/libs) - потом надо не забыть, где должны быть нужные библиотеки
3. Собрать статически.
...
Рейтинг: 0 / 0
(FreeBSD) Как подгружать библиотеку с нужного пути?
    #39820296
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Scott Tiger2. Задать rpath при сборке (опции gcc -Wl,-rpath,../path/to/libs) - потом надо не забыть, где должны быть нужные библиотекиВот на этом то варианте и вышел затык. Собственно, в стартовом посте о нем и написал.

Scott Tiger3. Собрать статически.Это как-то можно задать в опциях/переменных при выполнении ./configure или как?
...
Рейтинг: 0 / 0
(FreeBSD) Как подгружать библиотеку с нужного пути?
    #39820406
Фотография Scott Tiger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / (FreeBSD) Как подгружать библиотеку с нужного пути?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]