_init() и _fini() в shared library (Не получается использовать)

Модератор: Модераторы разделов

Аватара пользователя
Zeus
Сообщения: 694

_init() и _fini() в shared library

Сообщение Zeus »

Нужно выполнять некоторые действия при выгрузке библиотеки.
Для этого определил функцию _fini:

Код: Выделить всё

extern "C"
void _init ()
{
std::cout << "_init" << std::endl;
};

extern "C"
void _fini ()
{
std::cout << "_fini" << std::endl;
};


Компилирую так:
g++ -O2 -shared -fPIC -o libMylib.so Mylib.cpp

или так:
g++ -O2 -shared -fPIC -nostartfiles -o libMylib.so Mylib.cpp

Гружу dlopen'ом.

В итоге, получаю 3 исхода, ни один из которых меня не устраивает:
1. Либа не компилится. ld говорит "множественное определение _init и _fini"
2. С -nostartfiiles либа компилится, но при загрузке оказывается куча undefined reference, которые, как я понимаю, как-раз -nostartfiles'ами и отключились.
3. Если убрать extern "C" в объявлении функции (как, собственно, в Инете и написано), то всё компилится и загружается, но мои функции _init и _fini не вызываются.

Собственно вопрос: как сделать, чтобы вызывались _init и _fini?
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: _init() и _fini() в shared library

Сообщение v04bvs »

http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html

искать по слову destructor
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: _init() и _fini() в shared library

Сообщение Zeus »

Спасибо. Полезная информация.
Правда не совсем понятна привязка в функции main в контексте разделяемой библиотеки.
Да и не хотелось бы использовать фичи компилятора.
Правда мне тут в свете этого говорят: тогда и к _init'у не привязывайся.
Будем, мол, переносить код на платформу, где у либ другие инициализаторы - придётся менять.
Лучше сделать отдельную функцию, которая будет вызываться из основной программы.
Спасибо сказали:
Аватара пользователя
Liksys
Сообщения: 2910

Re: _init() и _fini() в shared library

Сообщение Liksys »

http://gazette.linux.ru.net/lg84/bradley.html
Это не пойдет? Я сам писал какую-то штукус плагинами, работало.
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: _init() и _fini() в shared library

Сообщение Zeus »

Darth Liksys писал(а):
24.08.2007 10:36
http://gazette.linux.ru.net/lg84/bradley.html
Это не пойдет? Я сам писал какую-то штукус плагинами, работало.

Это всё понятно.
Это как-раз то, о чём v04bvs написал.

Но не хочется затачиваться на особенности компилятора.
Я уже отказался от "автоматических" функций инициализации и "финализации" :tongue: в пользу явных (для пользователя библиотеки) функций инициализации.
Спасибо сказали: