Linux dlopen: библиотека может быть “уведомлена”, когда она загружается?

Я не профессионал, но мне нравится этот способ

Префикс приложения = XY; View = v; Хранимая процедура = p; Функция = F

Table: XY_Name
View: vXY_Name
Procedure: sXY_Name
Function: fXY_Name

Что вы думаете? Я знаю, что некоторые люди используют два символа для определения типа объекта, но одного символа достаточно для большинства случаев, верно?

13
задан jldupont 21 October 2009 в 17:42
поделиться

3 ответа

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

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

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

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

22
ответ дан 1 December 2019 в 19:02
поделиться

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

17
ответ дан 1 December 2019 в 19:02
поделиться

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

0
ответ дан 1 December 2019 в 19:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: