URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 8533
[ Назад ]

Исходное сообщение
"Отложенная загрузка библиотек."

Отправлено Wazar , 02-Дек-09 20:42 
Собственно, суть проблемы. Имеется скомпилированное CGI-приложение. Оно должно работать на каком то хостинге и при этом быть независимым от библиотек установленных на хостинге. То есть библиотеки должны загружаться не из /lib/ /usr/lib/ итп, а из установленного в файле настроек каталога. При этом LD_LIBRARY_PATH изменить возможности нет. Собственно есть вариант загружать библиотеку вручную с помощью системных вызовов, после чего получить указатели на нужные функции.
А нельзя ли прилинковать библиотеки на этапе компиляции, но при запуске приложения не загружать библиотеки а загрузить их вручную из кода. И чтобы проверка на наличие библиотек не выполнялась и сообщение вида "...error while loading shared libraries..." не выдавалась. Но при этом не искать указатели на нужные функции, а объявить их в коде просто как extern.

Содержание

Сообщения в этом обсуждении
"Отложенная загрузка библиотек."
Отправлено аноним , 02-Дек-09 22:14 
man статическая компиляция.


"Отложенная загрузка библиотек."
Отправлено Wazar , 03-Дек-09 14:54 
>man статическая компиляция.

В смысле использовать статические библиотеки (.a)?
А если нет нужной?

Переформулируя вопрос: как в gcc сделать так что бы библиотека .so прилинковалась, но при этом не загружалась при запуске исполняемого файла автоматически. А после загрузки библиотеки из кода к функциям можно было бы обращаться?


"Отложенная загрузка библиотек."
Отправлено Аноним , 04-Дек-09 04:47 
>В смысле использовать статические библиотеки (.a)?

Да.

>А если нет нужной?

Собрать.

>Переформулируя вопрос: как в gcc сделать так что бы библиотека .so прилинковалась
>но при этом не загружалась при запуске исполняемого файла автоматически

Никак. Динамические библиотеки по определению для этого не предназначены.


"Отложенная загрузка библиотек."
Отправлено ze6ra , 04-Дек-09 10:07 
>[оверквотинг удален]
>Да.
>
>>А если нет нужной?
>
>Собрать.
>
>>Переформулируя вопрос: как в gcc сделать так что бы библиотека .so прилинковалась
>>но при этом не загружалась при запуске исполняемого файла автоматически
>
>Никак. Динамические библиотеки по определению для этого не предназначены.

Поидее писать свой загрузчик динамических библиотек который будет выполнять ваши требования. В ELF вроде есть такая возможность. Так что при наличии времени и желания можно. Хотя может можно как-то и стандартный настроить на такое поведение.


"Отложенная загрузка библиотек."
Отправлено Wazar , 04-Дек-09 12:44 
>Собрать.

А если не имеется исходников? Вот, например, оракловый libociicus. Имеется so библиотека и заголовочные файлы. По этому собрать нельзя. Нет ли инструментов для конвертации динамических либ в статические?


"Отложенная загрузка библиотек."
Отправлено Вова , 04-Дек-09 14:43 
>>Собрать.
>
>А если не имеется исходников? Вот, например, оракловый libociicus. Имеется so библиотека
>и заголовочные файлы. Поэтому собрать нельзя.

В этом случае можно под этот заголовочный файл скомпилировать свою стабовую библиотеку, которая по вызову функций, объявленных в заголовочном файле будет вызывать подгруженные уже во время работы приложения библиотеки.


"Отложенная загрузка библиотек."
Отправлено DeadMustdie , 05-Дек-09 20:08 
>В этом случае можно под этот заголовочный файл скомпилировать свою стабовую библиотеку,
>которая по вызову функций, объявленных в заголовочном файле будет вызывать подгруженные
>уже во время работы приложения библиотеки.

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


"Отложенная загрузка библиотек."
Отправлено Wazar , 06-Дек-09 13:35 
>>В этом случае можно под этот заголовочный файл скомпилировать свою стабовую библиотеку,
>>которая по вызову функций, объявленных в заголовочном файле будет вызывать подгруженные
>>уже во время работы приложения библиотеки.
>
>Вариант реальный, но весьма трудоёмкий.
>Вообще исходная проблема лично мне кажется несколько надуманной.
>Если на хостинге есть возможность водрузить громоздкое проприетарное приложение
>(тот же Oracle, хотя бы в виде Instant Client) со всеми необходимыми
>настройками,
>то и библиотеки нужные поставить - тоже можно.

Нет. Речь идет о недорогих хостингах. Просто я занимаюсь написанием фреймворка для создания сайтов на D. И имеются две версии. Первая - в виде демона, пока тестирую но в целом работает. Ей веб-сервер не нужен, и она предназначена для работы либо на собственном сервере, или хотя бы VDS. Вторая - CGI - для тех хостингов где демона запустить нельзя. Эта версия проще и уже работает, одна проблема - непонятно как быть с либами.


"Отложенная загрузка библиотек."
Отправлено f00l , 07-Дек-09 09:10 
>>man статическая компиляция.
>
>В смысле использовать статические библиотеки (.a)?
>А если нет нужной?
>
>Переформулируя вопрос: как в gcc сделать так что бы библиотека .so прилинковалась,
>но при этом не загружалась при запуске исполняемого файла автоматически. А
>после загрузки библиотеки из кода к функциям можно было бы обращаться?
>

Используй набор функций dlopen(), dlsym() для динамической загрузки библиотеки и использования внутри программы , также при компиляции можно использовать опцию
-Wl,rpath,/local/lib указываешь путь и там программа будет искать библиотеку.