Linux-эквивалент DllMain

Есть ли в библиотеках * nix .so точка входа, которая вызывается системой, когда библиотека загружается и выгружается?

На более практическом замечании: если .so был написан на C ++ и содержит глобальные объекты с конструкторами и деструкторами и загружается из языка, который не имеет понятия конструирования / уничтожения, правильно ли создаются / уничтожаются глобальные объекты?

21

Решение

  1. Нет, нет эквивалента DllMain.

  2. Для библиотек JNI, например в Android может быть специальная запись JNI_OnLoad, предназначенная для заполнения таблицы функций JNI.

  3. GCC определяет специальный атрибут конструктор разрешить запуск некоторого кода при загрузке разделяемой библиотеки.

  4. C ++ гарантирует, что конструкторы для глобальных и статических объектов будут выполняться независимо от того, знал ли код, который загрузил .so, об этих классах или имел представление о конструкции.

    То же самое относится и к деструкторам, но могут быть несчастливые обстоятельства, когда, по крайней мере, некоторые деструкторы не имеют возможности бежать — например, когда есть sigfault и исключения отключены.

12

Другие решения

Вы можете использовать __attribute__((constructor)) а также __attribute__((destructor)) выполнить код при загрузке и выгрузке разделяемой библиотеки.

14

Используемая техника немного отличается, но
строительство / разрушение глобальных объектов более или менее встроено в
динамический загрузчик. (Даже под Windows нет необходимости проходить через
DllMain, Глобальные объекты будут построены / уничтожены правильно
тем не мение.)

5
По вопросам рекламы [email protected]