LINUX.ORG.RU

dlopen() и загрузка одной библиотеки больше 1 раза


0

0

Можно-ли через dlopen() загрузить одну библиотеку 2 и более раз так, чтобы данные у каждой новой копии получились свои?

Создание второй копии файла и загрузка как разных файлов помогает, но как-то не красиво.

★★★★

Ответ на: комментарий от theos

Ну а что, например, человеку делать, если есть закрытая библиотека, не-threadsafe, и работу с ней надо распараллелить (при этом, естественно, во всех потоках библиотеке суют непересекающиеся входные данные; проблема в том, что у неё где-то в потрохах global/static вместо tls).

Я совсем недавно в такой же ситуации размножал DLL-ку и писал обёртку-диспетчер, которая подсовывала каждому треду свой экземпляр. Этот способ работает, а все остальные сводятся к «написать заново» — либо библиотеку, либо приложение, что немного лучше, но не сильно.

Топикстартеру: увы, dlopen даже хардлинком не обмануть. Так что придётся размножать (впрочем, как я понял, место под копии реальной проблемой не является; если вдруг станет (при том что в память всё умещается(!)), можно на fuse какое-нибудь псевдорешение соорудить, я в этом уверен).

LeninGad
()
Ответ на: комментарий от Reset

> это не всегда возможно

Эту фразу можно написать после любого поста. Ждём критики от ТС.

const86 ★★★★★
()
Ответ на: комментарий от const86

> Use the Fork, Luke! :)

+1. А общие для всех процессов данные (к которым необходим доступ изо всех "тредов") можно поместить в shared memory (если его создать до форка, то он наследуется всеми дочерними процессами).

slav ★★
()
Ответ на: комментарий от LeninGad

>Ну а что, например, человеку делать, если есть закрытая библиотека

через LD_PRELOAD перехватываются функции.

Deleted
()
Ответ на: комментарий от Deleted

>через LD_PRELOAD перехватываются функции.

... которые нужно отфорвардить в сколько экземпляров библиотеки? Если в единственный, то оно как не работало, так и не будет работать, из-за тех же самых проблем (в моём примере -- shared data вместо tls). А если во многие, то см. пост наверху :)

LeninGad
()

Раз уж тема развилась, то хочется пояснить чего хотелось добиться.

Есть приложение для микроконтроллера (большая туча конечных автоматов и планировщик кооперативный). Естественно там полоно static переменных и т.д. Микроконтроллеры умеют работать в сети. Хотелось моделировать их работу. В принципе нужно им предоставлять простой функционал типа таймеров и IO. при необходимости вызывать планировщик.

Так вот хотелось сделать так, чтобы программа собиралась в .so, а моя программа могла загрузить несколько таких "эмуляторов" и соединив их в сеть заставить работать.

Такой вот изврат.

alexru ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.