#pragma init и #pragma fini с использованием компилятора GCC на Linux

StackOverflow https://stackoverflow.com/questions/2459859

  •  20-09-2019
  •  | 
  •  

Вопрос

Я хотел бы создать какой -то код, который вызывает код при загрузке общей библиотеки. Я думал, что сделаю это так:

#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

Так что это игнорирует мои #Pragmes. Я попробовал это в реальном коде, и мой код прервался, потому что функция не была вызвана в разделе Pragma, потому что она была проигнорирована.

Как заставить GCC использовать эти операторы #Pragma init и fini?

Это было полезно?

Решение

Прагмы практически все специфичные для компилятора. GCC не реализует init, но вы можете получить тот же эффект, используя constructor Атрибут функции:

static __attribute__((constructor)) void my_init()
{  
  //do-something
}

Есть также соответствующий destructor атрибут.

Другие советы

По всей видимости #pragma init а также #pragma fini поддерживаются только GCC для Solaris:

Вместо этого используйте C ++:

// 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
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top