Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

#pragma init and #pragma fini using gcc compiler on linux

Tags:

c

gcc

pragma

I would like to build some code which calls some code on loadup of the shared library. I thought i would do it like this:

#pragma init(my_init)

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

int add (int a,int b) {  
  return a+b; 
}

So when i build that code with

gcc -fPIC -g -c -Wall tt.c

It returns

gcc -fPIC -g -c -Wall tt.c 
tt.c:2: warning: ignoring #pragma init 
tt.c:4: warning: ‘my_init’ defined but not used

So its ignoring my #pragmas. I tried this in real code and my code aborted because a function hadn't been called in the pragma section because it was ignored.

How do i get gcc to use these #pragma init and fini statements?

like image 886
Josh Avatar asked Mar 17 '10 04:03

Josh


2 Answers

pragmas are almost all compiler-specific. GCC doesn't implement init, but you can get the same effect using the constructor function attribute:

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

There's also a corresponding destructor attribute.

like image 159
caf Avatar answered Nov 12 '22 02:11

caf


Apparently #pragma init and #pragma fini are only supported by GCC for Solaris:

  • http://gcc.gnu.org/onlinedocs/gcc-4.4.3/gcc/Solaris-Pragmas.html#Solaris-Pragmas
like image 32
Michael Burr Avatar answered Nov 12 '22 03:11

Michael Burr