- 论坛徽章:
- 0
|
在linux共享库中,可能需要用到两个特殊的函数:_init和_fini。
_init和_fini函数用在装载和卸载某个模块时分别控制该模块的构造器和析构器(或构造函数和析构函数)。他们的C语言原型如下:
void _init(void);
void _fini(void);
当一个库通过dlopen()动态打开或以共享库的形式打开时,如果_init在该库中存在且被输出出来,则_init函数会被调用。如果一个库通过dlclose()动态关闭或因为没有应用程序引用其符号而被卸载时,_fini函数会在库卸载前被调用。当使用你自己的_init和_fini函数时,会出现命名冲突,编译器提示已经存在这个名字,可以通过几种方式来解决:
1.自定义init函数名字,比如myinit用wl,选项给ld传递此名字:
gcc ... -Wl,-init=myinit.
2.可以使用GCC选项-nostartfiles 来使共享库不予系统启动文件一起编译
gcc ... -nostartfiles
3.使用上面的函数或GCC的-nostartfiles选项并不是很好的习惯,因为这可能会产生一些意外的结果。
相反,库应该使用__attribute__((constructor))和__attribute__((destructor))函数属性来输出它的构造函数和析构函数。如下所示:
void __attribute__((constructor)) x_init(void);
void __attribute__((destructor)) x_fini(void);
构造函数会在dlopen()返回前或库被装载时调用。析构函数会在这样几种情况下被调用:
dlclose()返回前
或main()返回后
或装载库过程中exit()被调用时。
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/49582/showart_1991983.html
[ 本帖最后由 georgeying 于 2009-7-11 14:44 编辑 ] |
|