Linux эквивалент DllMain
В библиотеках * nix.so есть ли точка входа, вызываемая системой, когда библиотека загружается и выгружается?
В более практическом примечании: если .so был написан на С++ и содержит глобальные объекты с конструкторами и деструкторами и загружен с языка, который не имеет понятия о конструкции/уничтожении, являются глобальными объектами, правильно построенными/разрушенными
Ответы
Ответ 1
-
Нет, нет эквивалента DllMain.
-
Для библиотек JNI, например. на Android может быть специальная запись JNI_OnLoad, которая предназначена для заполнения таблицы функций JNI.
-
GCC определяет специальный атрибут конструктор, чтобы разрешить запуск некоторого кода на загрузке совместно используемой библиотеки.
-
С++ гарантирует, что конструкторы для глобальных и статических объектов будут выполняться независимо от того, знал ли код, который загружал .so, знать об этих классах или имел понятие построения.
То же самое относится к деструкторам, но могут быть неприятные обстоятельства, когда, по крайней мере, некоторые деструкторы не имеют возможности запускать - например. когда есть sigfault, и исключения отключены.
Ответ 2
Вы можете использовать __attribute__((constructor))
и __attribute__((destructor))
для выполнения кода при загрузке и выгрузке разделяемой библиотеки.
Ответ 3
Используемая техника немного отличается, но
строительство/уничтожение глобальных объектов более или менее встроено в
динамический загрузчик. (Даже под Windows, нет необходимости проходить
DllMain
. Глобальные объекты будут построены/уничтожены правильно
во всяком случае.)