p247
共享库构造和析构函数
GCC提供共享库的构造函数,早函数声明时加上“attribute((constructor))”属性即可成为共享库构造函数,会在共享库被加载时执行,即在main函数之前执行。使用dlopen()打开时会在dlopen()返回前执行。
同样“attribute((destructor))”表示共享库析构函数,在main()函数返回后会被执行。如果使用dlclose()卸载共享库则会在dlclose()返回前执行。
如果有多个构造函数可以传一个优先级参数如:
void attribute((constructor(5))) init_function1(void);
void attribute((constructor(10))) init_function2(void);
优先级数字越小,优先级越高。析构函数则刚好相反。
共享库脚本
共享库不止是动态链接的ELF的共享文件(.so),还可以是符合格式的链接脚本文件。
例如可以把C运行库和数学库组成一个新的libfoo.so,内容可以如下:
GROUP { /lib/libc.so.6 /lib/libm.so.2 }