есть so-либа с экспортом одной единственной функции. либа написана на с++.
хочу по сигналу(к примеру SIGUSR1) выгружать использующуюся и подгружать новую. т.е., к примеру, я могу ее назвать как-то типа new-mylib.so, положить рядом, и процесс по сигналу будет выгружать использующуюся, переименовывать новую, и подгружать ее. ну, и, использовать.
функция, которая экспортируется из либы — stateless, а процесс — однопоточный.
вопрос в том, делал ли кто-то что-то подобное? и есть ли какие-мысли по вопросу или иные предложения?
спс.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Здравствуйте, watchmaker, Вы писали:
W>Но в man gcc не рассказывается как перезагрузить библиотеку, а в man dlopen — рассказывается.
все не так!
в man gcc расказывается как скомпилить код, который будет перезагружать библиотеку, который будет использовать man dlopen, иначе вся затея бессмысленна!
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Здравствуйте, niXman, Вы писали:
Pzz>>А что не понятно? Там совсем немного букв, и даже есть пример на Си... X>а больше, чем уже в этой теме? ато ни осилю.
1. Берем исходники библиотеки. Компилируем их с флагом -fPIC и линкуем с флагом -shared. Получаем в итоге shared object (динамически загружаемую "библиотеку".
2. Для линковки основной программы ее НЕ ИСПОЛЬЗУЕМ
3. Вместо этого основная программа загружает .so-ку функцией dlopen(), а потом добывает указатель на входную точку (точки) функцией dlsym(). dlsym() возвращает void*, который надо откастировать к требуемому типу
4. Получив в итоге указатель на функцию, вызываем ее
5. Когда хочется перезагрузить библиотеку, "отпускаем" старую функцией dlclose(), загружаем новую функцией dlopen(), и далее все по кругу.
dlopen() уместно звать с флагами:
RTLD_NOW — чтобы если в ней есть unresolved symbol, это вылезло сразу, а не при попытке обратиться.
RTLD_LOCAL — чтобы не засорять пространство имен
Здравствуйте, Pzz, Вы писали:
Pzz>1. Берем исходники библиотеки. Компилируем их с флагом -fPIC и линкуем с флагом -shared. Получаем в итоге shared object (динамически загружаемую "библиотеку". Pzz>2. Для линковки основной программы ее НЕ ИСПОЛЬЗУЕМ Pzz>3. Вместо этого основная программа загружает .so-ку функцией dlopen(), а потом добывает указатель на входную точку (точки) функцией dlsym(). dlsym() возвращает void*, который надо откастировать к требуемому типу Pzz>4. Получив в итоге указатель на функцию, вызываем ее Pzz>5. Когда хочется перезагрузить библиотеку, "отпускаем" старую функцией dlclose(), загружаем новую функцией dlopen(), и далее все по кругу.
Pzz>dlopen() уместно звать с флагами: Pzz>RTLD_NOW — чтобы если в ней есть unresolved symbol, это вылезло сразу, а не при попытке обратиться. Pzz>RTLD_LOCAL — чтобы не засорять пространство имен
я сдаюсь!
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Здравствуйте, Pzz, Вы писали:
Pzz>1. Берем исходники библиотеки. Компилируем их с флагом -fPIC и линкуем с флагом -shared. Получаем в итоге shared object (динамически загружаемую "библиотеку". Pzz>2. Для линковки основной программы ее НЕ ИСПОЛЬЗУЕМ Pzz>3. Вместо этого основная программа загружает .so-ку функцией dlopen(), а потом добывает указатель на входную точку (точки) функцией dlsym(). dlsym() возвращает void*, который надо откастировать к требуемому типу Pzz>4. Получив в итоге указатель на функцию, вызываем ее Pzz>5. Когда хочется перезагрузить библиотеку, "отпускаем" старую функцией dlclose(), загружаем новую функцией dlopen(), и далее все по кругу.
Pzz>dlopen() уместно звать с флагами: Pzz>RTLD_NOW — чтобы если в ней есть unresolved symbol, это вылезло сразу, а не при попытке обратиться. Pzz>RTLD_LOCAL — чтобы не засорять пространство имен
Вот по этому я радуюсь, что не стал развиваться в Linux направлении....
Здравствуйте, niXman, Вы писали:
X>вопрос в том, делал ли кто-то что-то подобное? и есть ли какие-мысли по вопросу или иные предложения?
выходит, никто ничего подобного не делал, мыслей ни у кого нет, и предложений — тоже.
буду первопроходцем.
спасибо за веселье. вопрос закрыт.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Здравствуйте, push, Вы писали:
P>слишком много гемора там, где его быть не должно (уж по крайней мере в 2016-то году)
ничего такого не замечал.
но вот работа в WINAPI — это действительно попаболь, черный ящик, и проприетарщина
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
X>>вопрос в том, делал ли кто-то что-то подобное? и есть ли какие-мысли по вопросу или иные предложения? X>выходит, никто ничего подобного не делал, мыслей ни у кого нет, и предложений — тоже. X>буду первопроходцем. X>спасибо за веселье. вопрос закрыт.
Дык вам вроде написали все функции которые нужно юзать и как их юзать, что не так то? Или вы ожидали что вам тут на-гора выдадут кусок кода который можно вставить себе? Дык бесплатно это делают только на S/O
Как много веселых ребят, и все делают велосипед...
X>>вопрос в том, делал ли кто-то что-то подобное? и есть ли какие-мысли по вопросу или иные предложения? X>выходит, никто ничего подобного не делал, мыслей ни у кого нет, и предложений — тоже. X>буду первопроходцем.
X>спасибо за веселье. вопрос закрыт.
Здравствуйте, niXman, Вы писали:
X>Здравствуйте, Pzz, Вы писали:
Pzz>>man dlopen X>гениально =) X>как если бы ответил man gcc =)
Ну я просто не могу промолчать.
Никсман, но ты ведь сам в таком же стиле ответы даешь.
Ну а если серьезно, то что не так?
Включая телепатию, могу предположить, что выгружать хочется библиотеку прилинкованную на этапе сборки?
Поэтому решение с dlopen вызывает такую реакцию? Ну ты это, не молчи, будь человеком, объясни почему тебе это не подходит.