|
(FreeBSD) Как подгружать библиотеку с нужного пути?
|
|||
---|---|---|---|
#18+
Никогда подобным не занимался с таким "размахом", а вот пришлось... Если не в тот подфорум написал, прошу модератора перенести куда надо. Имеется сервер под 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.
Ладно, едем дальше, конфигурирую php вот таким образом Код: sql 1. 2. 3. 4. 5. 6.
Если я правильно понял, тут LDFLAGS должна задать приоритетные пути поиска библиотек. Компиляция успешно, проходит, но при запуске php валится в кору. Разбор показал такие моменты: libcurl.so грузится из системной директории, а libssl.so грузится дважды - первый раз из php правильно, а второй раз из неправильной libcurl.so Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Посмотрел в truss - там даже нет попытки поискать libcurl.so в /usr/local/php56c/lib, а подгружается она сразу из /usr/local/lib Код: sql 1. 2. 3. 4.
Заглянул в Makefile - там в переменных окружения *_LDFLAGS* оба пути упоминаются, притом, первым всегда идет системный /usr/local/lib, а потом уже мой /usr/local/php56c/lib. Пробовал там тупым редактированием поменять пути местами, но результата оно не дало. Воооот... Теперь я понимаю, что надо как-то более убедительно уговаривать линковщик. но не понимаю, как именно. Советы, в основном, сводятся к LDFLAGS. Собственно, вопрос. Как уговорить то? Тем более, что для libssl.so оно сработало, хотя... там же разная версия библиотеки... ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2019, 12:15 |
|
(FreeBSD) Как подгружать библиотеку с нужного пути?
|
|||
---|---|---|---|
#18+
vkle, а что в переменной LD_LIBRARY_PATH? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2019, 12:39 |
|
(FreeBSD) Как подгружать библиотеку с нужного пути?
|
|||
---|---|---|---|
#18+
fandr, Установки каких-то явных значений для LD_LIBRARY_PATH не нашел. Каким образом и где посмотреть ее можно? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2019, 13:39 |
|
(FreeBSD) Как подгружать библиотеку с нужного пути?
|
|||
---|---|---|---|
#18+
# echo $LD_LIBRARY_PATH Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
PS: с FreeBSD не работаю, если что 8) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2019, 15:25 |
|
(FreeBSD) Как подгружать библиотеку с нужного пути?
|
|||
---|---|---|---|
#18+
Изначально LD_LIBRARY_PATH пустая. Если перед запуском программы (которая в кору падала) установить свою директорию Код: sql 1.
, тогда загрузка библиотеки правильно происходит. Это вариант... с большим натягом на самый крайний случай, когда ну ни под каким соусом не получится нормально скомпилировать php. Меня же интересует в бОльшей мере способ сказать линковщику, чтобы он правильный путь загрузки библиотеки в бинарнике сделал сразу, при сборке. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2019, 15:41 |
|
(FreeBSD) Как подгружать библиотеку с нужного пути?
|
|||
---|---|---|---|
#18+
переменные окружения для того и предназначены, что бы при их помощи все работало без перекомпиляции как-то странно стремиться к обратному кстати, правильно делать так: # export LD_LIBRARY_PATH=/usr/local/php56c/lib:$LD_LIBRARY_PATH ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2019, 16:26 |
|
(FreeBSD) Как подгружать библиотеку с нужного пути?
|
|||
---|---|---|---|
#18+
Вы хотите сказать, что компилятору виднее, как собирать программу, а с остальным нехай пользователи трахтибидохаются, устанавливая переменные окружения перед запуском после успешного выпадания в кору? ;-) Корявенько как-то выходит... Хотя, как вариант, можно и обертку для php сделать, чтобы ручками не ставить LD_LIBRARY_PATH при запуске. Видимо, действительно, опция конфигурирования Код: sql 1. 2.
вместе с толкованием 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 там не требуется. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2019, 16:59 |
|
(FreeBSD) Как подгружать библиотеку с нужного пути?
|
|||
---|---|---|---|
#18+
Залез (немытыми руками, конечно) в 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 следует или... как это более правильно делается? Ну, на случай, если в будущем придется с какими-то другими опциями пересобрать. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2019, 02:52 |
|
(FreeBSD) Как подгружать библиотеку с нужного пути?
|
|||
---|---|---|---|
#18+
vkleИмеется сервер под FreeBSD 12.0, где штатно из портов установлен php 7.2. Потребовалось дополнительно установить пару более ранних версий, начал с php 5.6. Скомпилировал ее по а впакетах нужной версии нет, чтобы не мучаться с ручной сборкой? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2019, 09:30 |
|
(FreeBSD) Как подгружать библиотеку с нужного пути?
|
|||
---|---|---|---|
#18+
bga83а впакетах нужной версии нет, чтобы не мучаться с ручной сборкой?В пакетах не глядел. Из портов выкинули 5.6 не так давно. И там ещё где-то в шатных мейкфайлах особенность есть, что можно поставить одну из трех доступных версий PHP, а две конфликтуют, так как файлы на одни и те же пути ставятся под одними именами. Пакеты обычно мало чем отличаются, ну, только что минорная версия постарее будет. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2019, 10:40 |
|
(FreeBSD) Как подгружать библиотеку с нужного пути?
|
|||
---|---|---|---|
#18+
vklebga83а впакетах нужной версии нет, чтобы не мучаться с ручной сборкой?В пакетах не глядел. Из портов выкинули 5.6 не так давно. И там ещё где-то в шатных мейкфайлах особенность есть, что можно поставить одну из трех доступных версий PHP, а две конфликтуют, так как файлы на одни и те же пути ставятся под одними именами. Пакеты обычно мало чем отличаются, ну, только что минорная версия постарее будет. еще есть вариант с модулями наподобие https://lmod.readthedocs.io/en/latest/ но я не уверен наличия подобного решения под FreeBSD, в линуксах точно работает. С фряхой давно уже дела не имел с lmod или аналогами хоть десяток версий одного и того же софта ставить можно. идея заключается в том что они раскладывают по разным папкам и при необходимости работать с определенной версией софтины автоматом проставляются все переменные окружения ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2019, 11:02 |
|
(FreeBSD) Как подгружать библиотеку с нужного пути?
|
|||
---|---|---|---|
#18+
bga83еще есть вариант с модулями наподобие https://lmod.readthedocs.io/en/latest/ но я не уверен наличия подобного решения под FreeBSDЗанятная штука, но нету. Докер, насколько помню, пока в состоянии экспериментов, да и требования к типу ФС предъявляет. Потому по совокупности было выбрано решение собрать нужные вручную из исходников. Оно не вполне просто, конечно. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2019, 11:37 |
|
(FreeBSD) Как подгружать библиотеку с нужного пути?
|
|||
---|---|---|---|
#18+
vkleВы хотите сказать, что компилятору виднее, как собирать программу, а с остальным нехай пользователи трахтибидохаются, устанавливая переменные окружения перед запуском после успешного выпадания в кору? ;-) В целом - да, хотя это не компилятор, а компоновщик (линкер) задействован. Вы же собираете своё похапе и его зависимости с динамической компоновкой и без указания rpath, поэтому при запуске динамический компоновщик подгрузит библиотеку исходя из своих умолчаний, определяемых, в том числе, и переменными окружения. Вариантов несколько: 1. Оставить как есть будет самый правильный вариант. Пользователь программы обязан знать, какие библиотеки программе нужны, где их можно взять и уметь прочитать man rtld 2. Задать rpath при сборке (опции gcc -Wl,-rpath,../path/to/libs) - потом надо не забыть, где должны быть нужные библиотеки 3. Собрать статически. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2019, 12:29 |
|
(FreeBSD) Как подгружать библиотеку с нужного пути?
|
|||
---|---|---|---|
#18+
Scott Tiger2. Задать rpath при сборке (опции gcc -Wl,-rpath,../path/to/libs) - потом надо не забыть, где должны быть нужные библиотекиВот на этом то варианте и вышел затык. Собственно, в стартовом посте о нем и написал. Scott Tiger3. Собрать статически.Это как-то можно задать в опциях/переменных при выполнении ./configure или как? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2019, 13:13 |
|
|
start [/forum/topic.php?fid=25&msg=39819818&tid=1481158]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
141ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
2ms |
others: | 12ms |
total: | 251ms |
0 / 0 |