linux, "горячая" перезагрузка so-библиотеки
От: niXman Ниоткуда https://github.com/niXman
Дата: 11.03.16 18:17
Оценка:
привет!

есть so-либа с экспортом одной единственной функции. либа написана на с++.

хочу по сигналу(к примеру SIGUSR1) выгружать использующуюся и подгружать новую. т.е., к примеру, я могу ее назвать как-то типа new-mylib.so, положить рядом, и процесс по сигналу будет выгружать использующуюся, переименовывать новую, и подгружать ее. ну, и, использовать.

функция, которая экспортируется из либы — stateless, а процесс — однопоточный.

вопрос в том, делал ли кто-то что-то подобное? и есть ли какие-мысли по вопросу или иные предложения?

спс.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Отредактировано 11.03.2016 18:18 niXman . Предыдущая версия .
Re: linux, "горячая" перезагрузка so-библиотеки
От: Pzz Россия https://github.com/alexpevzner
Дата: 11.03.16 18:20
Оценка: 1 (1) +2 -1
Здравствуйте, niXman, Вы писали:

X>вопрос в том, делал ли кто-то что-то подобное? и есть ли какие-мысли по вопросу или иные предложения?


man dlopen
Re[2]: linux, "горячая" перезагрузка so-библиотеки
От: niXman Ниоткуда https://github.com/niXman
Дата: 11.03.16 18:25
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>man dlopen

гениально =)
как если бы ответил man gcc =)
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Отредактировано 11.03.2016 18:33 niXman . Предыдущая версия .
Re[3]: linux, "горячая" перезагрузка so-библиотеки
От: watchmaker  
Дата: 11.03.16 19:15
Оценка:
Здравствуйте, niXman, Вы писали:


Pzz>>man dlopen

X>гениально =)
X>как если бы ответил man gcc =)

Но в man gcc не рассказывается как перезагрузить библиотеку, а в man dlopen — рассказывается.
Re[4]: linux, "горячая" перезагрузка so-библиотеки
От: niXman Ниоткуда https://github.com/niXman
Дата: 11.03.16 19:24
Оценка:
Здравствуйте, watchmaker, Вы писали:

W>Но в man gcc не рассказывается как перезагрузить библиотеку, а в man dlopen — рассказывается.

все не так!
в man gcc расказывается как скомпилить код, который будет перезагружать библиотеку, который будет использовать man dlopen, иначе вся затея бессмысленна!
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Отредактировано 11.03.2016 19:36 niXman . Предыдущая версия . Еще …
Отредактировано 11.03.2016 19:26 niXman . Предыдущая версия .
Re[3]: linux, "горячая" перезагрузка so-библиотеки
От: Pzz Россия https://github.com/alexpevzner
Дата: 11.03.16 19:35
Оценка:
Здравствуйте, niXman, Вы писали:

Pzz>>man dlopen

X>гениально =)
X>как если бы ответил man gcc =)

А что не понятно? Там совсем немного букв, и даже есть пример на Си...
Re[4]: linux, "горячая" перезагрузка so-библиотеки
От: niXman Ниоткуда https://github.com/niXman
Дата: 11.03.16 19:38
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>А что не понятно? Там совсем немного букв, и даже есть пример на Си...

больше чем в этой теме? ато ни асилю.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Отредактировано 11.03.2016 19:44 niXman . Предыдущая версия .
Re[5]: linux, "горячая" перезагрузка so-библиотеки
От: Pzz Россия https://github.com/alexpevzner
Дата: 11.03.16 19:51
Оценка: 4 (1) +3
Здравствуйте, 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 — чтобы не засорять пространство имен
Re[6]: linux, "горячая" перезагрузка so-библиотеки
От: niXman Ниоткуда https://github.com/niXman
Дата: 11.03.16 20:12
Оценка: -1
Здравствуйте, 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 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[6]: linux, "горячая" перезагрузка so-библиотеки
От: push  
Дата: 11.03.16 21:53
Оценка: :)
Здравствуйте, 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 направлении....
Re[7]: linux, "горячая" перезагрузка so-библиотеки
От: niXman Ниоткуда https://github.com/niXman
Дата: 11.03.16 22:33
Оценка:
Здравствуйте, push, Вы писали:

P>Вот по этому я радуюсь, что не стал развиваться в Linux направлении....

слишком сложно? или что?
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[8]: linux, "горячая" перезагрузка so-библиотеки
От: push  
Дата: 11.03.16 22:48
Оценка: :)
Здравствуйте, niXman, Вы писали:

X>слишком сложно? или что?


слишком много гемора там, где его быть не должно (уж по крайней мере в 2016-то году)
Re[9]: linux, "горячая" перезагрузка so-библиотеки
От: Evgeny.Panasyuk Россия  
Дата: 11.03.16 23:16
Оценка: +2
Здравствуйте, push, Вы писали:

P>слишком много гемора там, где его быть не должно (уж по крайней мере в 2016-то году)


В других OS примерно также.
Проще в других языках, например в динамических есть штуки типа monkey patch, но это от OS не зависит
Re[7]: linux, "горячая" перезагрузка so-библиотеки
От: c-smile Канада http://terrainformatica.com
Дата: 11.03.16 23:22
Оценка: +10
Здравствуйте, push, Вы писали:

P>Вот по этому я радуюсь, что не стал развиваться в Linux направлении....


Стесняюсь, но спрошу... а в каком направлении "стал развиваться" ? И какие успехи?

А так, что dlopen/dlclose, что LoadLibrary()/FreeLibrary() одно и то же.
Re[7]: linux, "горячая" перезагрузка so-библиотеки
От: Pzz Россия https://github.com/alexpevzner
Дата: 12.03.16 07:58
Оценка:
Здравствуйте, push, Вы писали:

P>Вот по этому я радуюсь, что не стал развиваться в Linux направлении....


Меньше знаешь — крепче спишь?
Отредактировано 12.03.2016 8:00 Pzz . Предыдущая версия .
Re: linux, "горячая" перезагрузка so-библиотеки
От: niXman Ниоткуда https://github.com/niXman
Дата: 12.03.16 10:22
Оценка: -5 :)))
Здравствуйте, niXman, Вы писали:

X>вопрос в том, делал ли кто-то что-то подобное? и есть ли какие-мысли по вопросу или иные предложения?

выходит, никто ничего подобного не делал, мыслей ни у кого нет, и предложений — тоже.
буду первопроходцем.

спасибо за веселье. вопрос закрыт.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[9]: linux, "горячая" перезагрузка so-библиотеки
От: niXman Ниоткуда https://github.com/niXman
Дата: 12.03.16 10:52
Оценка:
Здравствуйте, push, Вы писали:

P>слишком много гемора там, где его быть не должно (уж по крайней мере в 2016-то году)

ничего такого не замечал.
но вот работа в WINAPI — это действительно попаболь, черный ящик, и проприетарщина
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[2]: linux, "горячая" перезагрузка so-библиотеки
От: ononim  
Дата: 12.03.16 13:23
Оценка:
X>>вопрос в том, делал ли кто-то что-то подобное? и есть ли какие-мысли по вопросу или иные предложения?
X>выходит, никто ничего подобного не делал, мыслей ни у кого нет, и предложений — тоже.
X>буду первопроходцем.
X>спасибо за веселье. вопрос закрыт.
Дык вам вроде написали все функции которые нужно юзать и как их юзать, что не так то? Или вы ожидали что вам тут на-гора выдадут кусок кода который можно вставить себе? Дык бесплатно это делают только на S/O
Как много веселых ребят, и все делают велосипед...
Re[2]: linux, "горячая" перезагрузка so-библиотеки
От: m2l  
Дата: 12.03.16 14:57
Оценка: +4
X>>вопрос в том, делал ли кто-то что-то подобное? и есть ли какие-мысли по вопросу или иные предложения?
X>выходит, никто ничего подобного не делал, мыслей ни у кого нет, и предложений — тоже.
X>буду первопроходцем.

X>спасибо за веселье. вопрос закрыт.



Тебе готовое решение дали. Чего ещё не хватает?
Re[3]: linux, "горячая" перезагрузка so-библиотеки
От: wander  
Дата: 12.03.16 17:36
Оценка:
Здравствуйте, niXman, Вы писали:

X>Здравствуйте, Pzz, Вы писали:


Pzz>>man dlopen

X>гениально =)
X>как если бы ответил man gcc =)

Ну я просто не могу промолчать.
Никсман, но ты ведь сам в таком же стиле ответы даешь.

Ну а если серьезно, то что не так?
Включая телепатию, могу предположить, что выгружать хочется библиотеку прилинкованную на этапе сборки?
Поэтому решение с dlopen вызывает такую реакцию? Ну ты это, не молчи, будь человеком, объясни почему тебе это не подходит.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.