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:
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 }
来源:https://stackoverflow.com/questions/2459859/pragma-init-and-pragma-fini-using-gcc-compiler-on-linux