Функция подключения к выгрузке разделяемой библиотеки - PullRequest
0 голосов
/ 28 сентября 2018

Я хочу добавить функцию ловушки, которая будет вызываться при выгрузке разделяемой библиотеки.Библиотека связана на complitaion.Можно ли сделать такую ​​вещь?Может у gcc есть флаг для этого?

Я видел подобное решение для загрузки библиотеки во время выполнения, но оно не соответствует моим ожиданиям.

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

Для систем Linux на странице справки dlopen() / dlclose() объясняется, как добавить такую ​​функцию в вашу библиотеку:

Функции инициализации и финализации

Общие объекты могутэкспортировать функции, используя атрибуты функций __attribute__((constructor)) и __attribute__((destructor)).Функции конструктора выполняются до возврата dlopen(), а функции деструктора выполняются до возврата dlclose().Общий объект может экспортировать несколько конструкторов и деструкторов, и приоритеты могут быть связаны с каждой функцией, чтобы определить порядок, в котором они выполняются.Для получения дополнительной информации см. Информационные страницы gcc (в разделе «Атрибуты функций»).

Более старый способ (частично) достижения того же результата заключается в использовании двух специальных символов, распознаваемых компоновщиком: _init и_fini.Если динамически загруженный общий объект экспортирует подпрограмму с именем _init(), то этот код выполняется после загрузки общего объекта до возврата dlopen().Если общий объект экспортирует подпрограмму с именем _fini(), то эта подпрограмма вызывается непосредственно перед выгрузкой объекта.В этом случае следует избегать ссылок на файлы запуска системы, которые содержат версии этих файлов по умолчанию;это можно сделать с помощью параметра командной строки gcc (1) -nostartfiles.

Использование _init и _fini теперь не рекомендуется в пользу вышеупомянутых конструкторов и деструкторов, что среди прочих преимуществ, разрешить определение нескольких функций инициализации и завершения.

0 голосов
/ 28 сентября 2018

Solaris и GNU / Linux поддерживают интерфейс LD_AUDIT в своих динамических компоновщиках.Вам необходимо загрузить модуль аудитора, который реализует функцию обратного вызова la_objclose:

Реализация может быть простойкак это:

unsigned int
la_objclose  (uintptr_t *cookie)
{
  printf ("objclose\n");
  return 0;
}

Чтобы определить, какой объект закрывается, вам также необходимо реализовать la_objsearch (и, возможно, la_objopen), чтобы установить значение cookie, которое каким-то образом ссылается на информацию, которую вынужно в ближайшее время (например, вы можете сохранить указатель на выделенную кучу структуру в cookie).

...