#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.

Ответ 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
}