Automatically executed functions when loading shared libraries

来源:互联网 发布:对美工电商有什么了解 编辑:程序博客网 时间:2024/06/11 18:31

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.

0 0