linux dlopen: можно ли "уведомлять" библиотеку при ее загрузке? - PullRequest
13 голосов
/ 21 октября 2009

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

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

Ответы [ 3 ]

22 голосов
/ 21 октября 2009

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

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

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

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

17 голосов
/ 22 октября 2009

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

// 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)), оно будет переносимым. Тем не менее, обратите внимание, что если у вас есть несколько подобных объектов, нет никакой гарантии в отношении порядка строительства / разрушения.

0 голосов
/ 21 октября 2009

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

...