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?
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.
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
Instead, use 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
}