Подтвердить что ты не робот

Linux dlopen: можно ли "уведомлять" библиотеку при ее загрузке?

Есть ли способ, чтобы общая библиотека была "уведомлена" при ее загрузке?

Другими словами, допустим, что я использую dlopen в общей библиотеке, есть ли функция, которая автоматически вызывается (если присутствует) в общей библиотеке (например, main?)

4b9b3361

Ответ 1

Библиотеки должны экспортировать инициализацию и процедуры очистки с использованием gcc __ атрибут __ ((конструктор)) и атрибуты __ атрибута __ ((деструктор)). См. Информационные страницы gcc для информацию об этом. Конструктор подпрограммы выполняются до dlopen возвращает (или до запуска main() если библиотека загружается при загрузке время). Процедуры деструктора выполняется до возвращения dlclose (или после выхода() или завершения основного() если библиотека загружается при загрузке время). Прототипы С для этих функции:

 void __attribute__ ((constructor))  my_init(void);  
 void __attribute__  ((destructor)) my_fini(void);

Взято из http://tldp.org/HOWTO/Program-Library-HOWTO/index.html

Это означает, что вы просто нажимаете на __attribute__ ((конструктор)) на функции, которые вы хотите вызвать при загрузке разделяемой библиотеки. Вышеупомянутый документ также отмечает, что более старые функции _ini и _fini считаются устаревшими.

Ответ 2

Да. Когда библиотека открывается, происходит все статическое построение... поэтому, если вы используете С++, вы можете сделать:

// mylibrary.cpp
namespace
{
    class dynamic_library_load_unload_handler
    {
         public:
              dynamic_library_load_unload_handler(){
                    // Code to execute when the library is loaded
              }
              ~dynamic_library_load_unload_handler(){
                    // Code to execute when the library is unloaded
              }
    } dynamic_library_load_unload_handler_hook;
}

В отличие от приведенных решений __attribute__ ((constructor)), это будет переносимым. Обратите внимание, однако, что если у вас есть несколько объектов, подобных этому, нет никакой гарантии относительно порядка строительства/уничтожения.

Ответ 3

По крайней мере, в Linux и, возможно, по крайней мере в некоторых других Unix-системах, если библиотека динамически открывается, глобальная функция с именем _init, если она существует, будет вызываться динамическим компоновщиком.