共享库有类似C++类构造和析构函数的函数,当动态库加载和卸载的时候,函数会被分别执行。一个函数加上 constructor的 attribute就成了构造函数;加上 destructor就成了析构函数。
下面举例说明。
$ cat 1.c
#include <stdio.h>
extern void goo(void);
__attribute__((constructor)) void init1(void) {
printf("library lib1.so loaded!\n");
}
__attribute__((destructor)) void fini1(void) {
printf("library lib1.so unloaded!\n");
}
void foo(void)
{
printf("foo\n");
goo();
}
$ cat 2.c
#include <stdio.h>
__attribute__((constructor)) void init2(void) {
printf("library lib2.so loaded!\n");
}
__attribute__((destructor)) void fini2(void) {
printf("library lib2.so unloaded!\n");
}
void goo(void)
{
printf("goo\n");
}
$ cat main.c
#include <stdio.h>
extern void foo();
int main(void)
{
foo();
return 0;
}
gcc 1.c -fPIC -shared -g -o lib1.so
gcc 2.c -fPIC -shared -g -o lib2.so
gcc main.c -g -o main -L. -l1 -l2
执行结果:
$ ./main
library lib2.so loaded!
library lib1.so loaded!
foo
goo
library lib1.so unloaded!
library lib2.so unloaded!