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