LINUX.ORG.RU

dlopen() ?


0

0

Здраствуйте.
У меня такой воросик возможно глупый, но интересный.
Делаю прогу которая загружает динамически библиотеки,
ташит из них указатели на функции и работает с ними.
В терминах ООП - создал объект который инкапсулирует системные вызовы
 dlopen(); dlclose();  dlsym(); 
При создании такого объекта происходит загрузка нужной библиотеки по 
указанному пути к ней.
Создал список таких объектов. Загрузка, добавление в список - работает.
А вот удаление из списка - выгрузка нет.
так как во время работы со списком создаются и удаляются
временные объекты, возник вопрос.
Как загрузится ли например 2 раза одна и та-же библиотека
в один и тот-же процесс и соответственно она должна быть выгружена 2-ды
или нет.
У меня ошибка при выгрузке. Пишет что библиотека не загружена. :(
(создается впечатление что выгружаю один раз лишний)
Возможно не это причина, но ....
Если не трудно напишите пожалуйста, кто что занает по этому поводу.    
anonymous

Shared library грузится один раз. С каждой связан счетчик вызовов dlopen, которым не соответствует вызов dlclose. При последующих вызовах dlopen счетчик просто икрементируется. При выгрузке наоборот - происходит декремент, и если счетчик становится равным нулю, случается выгрузка библиотеки. Так что, скорее всего, действительно, выгружаешь лишний раз. Может, у тебя лишняя выгрузка в каком-нибудь деструкторе?

А что значит "говорит что не загружено"? Правильную причину может соообщить только dlerror()...

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

Отлично, огромное спасибо.
Пару минут назад нашел ошибку именно как Вы сказали.
но не в деструкторе, а к операторе копирования. 
Впрочем один черт, там было сделанно некорректно,
не было открытия библиотеки, А в деструкторе удаление было.
Огромное спасибо.
Хорошо что самому не нужно писать весь механизм избавляющий
от лишнего открытия. 
Если не секрет, где можно почитать, посмотреть такую информацию ?
Это ведь библиотека - значит в исходниках библиотеки, так ? 

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

>Правильную причину может соообщить только dlerror()...
Вот она-то и писала это. :)
...
  if (dlclose(m_handleLib) == -1)
  {
    char  mess[1024];
    sprintf(mess, "no close lib:'%s', error:'%s'\n",
                   m_chNameLib, dlerror());
       //printf("clPointObject::fn_unLoadLib():error:'%s'; throw ...\n",mess);
    throw clError(mess);
  } // if()

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

В манах (man dlopen) в общем-то хорошо написано... а в исходники без крайней надобности лучше не лезть - здоровье поберечь ;-)

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