Linux эквивалент DllMain - программирование

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

Ответ 3

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