http://stackoverflow.com/questions/9759880/automatically-executed-functions-when-loading-shared-libraries
You can define an on-load function for a linux library using the .init
mechanism. This is the same as specifying the load-time entry point for a binary (e.g. using something other than main as the entry point for a program).
When linking using ld
directly you use the:
-init <function name>
or if you're using cc/gcc to link, you use:
-Wl,-init,<function name>
This is at it's most simple level.
Edit For destructors/finalizers, you use the .fini
mechanism. This operates in the same manner as the init option, and you use:
-fini <function name>
when invoking ld
. Availability is limited to the -init
option on the Mac OSX platform.
You should also be able to use the __attribute__((constructor))
syntax for gcc:
static void con() __attribute__((constructor));
void con() {
printf("I'm a constructor\n");
}
Which is probably a more portable way rather than screwing with the linker options. All constructors should be invoked at load-time, but don't depend on the order of their initialization, that leads to insanity and unreproducible bugs that cost time and effort to debug.
Edit 2 The use of the __attribute__((constructor))/__attribute__((destructor))
semantic is the most preferable mechanism for the C/C++ programming language.
For the D
programming language you should really use the static module constructor/destructor:
static this() {
printf("static this for mymodule\n");
}
static ~this() {
printf("static ~this for mymodule\n");
}
Or the static class constructor:
class Foo {
static this() {
printf("static this for Foo\n");
}
}
This is strongly hinted at in the writing win32 DLLS and in the language specification relating to static constructors/destructors.