Did you know that shared libraries can have constructors and destructors?
#include <stdio.h> __attribute__((constructor)) static void init1(void) { puts("init1"); } __attribute__((constructor)) static void init2(void) { puts("init2"); } __attribute__((destructor)) static void term1(void) { puts("term1"); } __attribute__((destructor)) static void term2(void) { puts("term2"); }
#include <dlfcn.h> #include <stdio.h> #include <stdlib.h> int main(void) { void *mylib = dlopen("libmy.dylib", RTLD_LAZY); if (!mylib) { fprintf(stderr, "dlopen: %s\n", dlerror()); return EXIT_FAILURE; } if (dlclose(mylib)) { fprintf(stderr, "dlclose: %s\n", dlerror()); return EXIT_FAILURE; } return EXIT_SUCCESS; }
$ ./main init1 init2 term2 term1