免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1291 | 回复: 0
打印 上一主题 下一主题

linux下动态共享库的构造与析构 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-07-10 15:05 |只看该作者 |倒序浏览
在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 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP