#pragma init и #pragma fini с использованием gcc-компилятора на linux
Я хотел бы создать код, который вызывает некоторый код при загрузке разделяемой библиотеки. Я думал, что сделаю это вот так:
#pragma init(my_init)
static void my_init () {
//do-something
}
int add (int a,int b) {
return a+b;
}
Поэтому, когда я создаю этот код с помощью
gcc -fPIC -g -c -Wall tt.c
Он возвращает
gcc -fPIC -g -c -Wall tt.c
tt.c:2: warning: ignoring #pragma init
tt.c:4: warning: ‘my_init’ defined but not used
Итак, он игнорирует мои #pragmas. Я пробовал это в реальном коде, и мой код прервался, потому что функция не была вызвана в разделе pragma, потому что она была проигнорирована.
Как мне получить gcc для использования этих #pragma init и fini-операторов?
Ответы
Ответ 1
pragmas почти все специфичны для компилятора. GCC не реализует init
, но вы можете получить тот же эффект, используя атрибут функции constructor
:
static __attribute__((constructor)) void my_init()
{
//do-something
}
Также имеется соответствующий атрибут destructor
.
Ответ 2
По-видимому, #pragma init
и #pragma fini
поддерживаются только GCC для Solaris:
Ответ 3
Вместо этого используйте С++:
// init.cpp
namespace // an anonymous namespace
{
class autoinit
{
public:
~autoinit(){ /* destruction code, if applicable */ }
private:
autoinit(){ /* content of myinit */ }
static autoinit _instance;
};
autoinit
autoinit::_instance; // static instance forces static construction
}