跳到分类
  • 首页
  • 关于本站

关注互联网最新资讯,最新技术趋势
首页
码农视界
大数据
开源技术
创业动态
发表于 2014-11-12
0 条评论

linux共享动态库中同名对象重复析构-两次析构或多次析构的解决办法

创业动态

Linux 平台下的共享动态库,一般都是通过选项“-fPIC”编译出来。有些应用程序需要链接多个共享库,此时如果在这些共享库中存在相同作用域范围的同名静态成员变量,那么当程序访问完静态成员变量结束析构时,由于内存的 double free 会导致程序 core dump;该问题是由于 Linux 编译器的缺陷造成的,本文就此问题进行深入分析,并指出可以通过新的编译选项“-fPIE”加以解决。
Linux 支持的共享程序库(lib*.so)技术不仅能够有效利用系统资源,而且还对程序设计带来了很大的便利性、通用性等,因此被各种级别的应用系统广泛采用。 动态链接的共享库是在加载应用程序时被加载的,而且它与应用程序是在运行时绑定的:通过动态链接器,将动态共享库映射进应用程序的可执行内存中(动态链接);在启动应用程序时,动态装载器将所需的共享目标库映射到应用程序的内存(动态装载)。
在通常情况下,共享库都是通过使用附加选项 -fpic 或 -fPIC 进行编译,从目标代码产生位置无关的代码(Position Independent Code,PIC),使用 -shared选项将目标代码放进共享目标库中。位置无关代码需要能够被加载到不同进程的不同地址,并且能得以正确的执行,故其代码要经过特别的编译处理:位置无关代码(PIC)对常量和函数入口地址的操作都是采用基于基寄存器(base register)BASE+ 偏移量的相对地址的寻址方式。即使程序被装载到内存中的不同地址,即 BASE 值不同,而偏移量是不变的,所以程序仍然可以找到正确的入口地址或者常量。
然而,当应用程序链接了多个共享库,如果在这些共享库中,存在相同作用域范围的同名静态成员变量或者同名 ( 非静态 ) 全局变量,那么当程序访问完静态成员变量或全局变量结束析构时,由于某内存块的 double free 会导致 core dump,这是由于 Linux 编译器的缺陷造成的。
如何解决这一问题呢?
这种情况下,如果替换使用选项 -fpie或 -fPIE,来编辑目标可执行程序,该问题就会解决。
这是因为,当使用选项 -fpie或 -fPIE时,生成的共享库不会为静态成员变量或全局变量在 GOT中创建对应的条目(通过 objdump或 readelf命令可以查看,此处不再赘述),从而避免了由于静态对象“构造一次,析构两次”而对同一内存区域释放两次引起的程序 core dump。选项 -fpie和 -fPIE与 -fpic及 -fPIC的用法很相似,区别在于前者总是将生成的位置无关代码看作是属于程序本身,并直接链接进该可执行程序,而非存入全局偏移表 GOT中;这样,对于同名的静态或全局对象的访问,其构造与析构操作将保持一一对应。
通过使用选项 -fpie或 -fPIE代替 -fpic或者 -fPIC,使得生成的共享库不会为静态成员变量或全局变量在 GOT中创建对应的条目,同时也就避免了针对同名静态对象“构造一次,析构两次”的不当操作。

转发到新浪微博
除非注明,本站文章均为原创或编译,转载请注明: 文章来自程序界
分享给朋友:

轻松一刻

相关文章
随机文章
    • 暂无相关日志
    • 社交游戏沉浮:偷菜时代一去不返 卡牌类或爆发
    • 曾李青五年风投经验总结:9种公司不能投
    • 百度隐忧:流量变现曲线下滑 遭遇内容壁垒
    • 360搜索被指偷来的“市场第二”
    • 老罗写代码了
    • 日前twitter前首席科学家阿卜杜勒出资135万美元启动秘密项目-PUSHD
    • 个人角度谈一点对go和erlang两门语言的体会
    • 专利文件暴露Meta元宇宙野心:克隆全人类
    • Groupon的五大教训
    • 引爆大社交价值?SNS发展迎来新拐点
所有评论

发表评论

取消回复

带星号*是必填项目。由于缓存,您的评论会稍后显示;请以个人的名义发表评论,昵称填写产品或网站名、评论内容附加无关网址将不通过审核。

上一篇: 周鸿祎冰水浇头,接受als慈善冰桶挑战

下一篇: 那些年,我开发过的约炮软件-由陌陌上市谈谈im产品这点事儿

← 返回首页
热门资讯
本周
本月
昨日
    • 失乐园—疫情下北京手艺人众生像,当下失落的码农和相声艺人
    • 字节跳动裁撤投资部,反垄断改革举措继续深入
    • 微软将面临严格审查!斥资687亿收购暴雪或将构成垄断
    • 专利文件暴露Meta元宇宙野心:克隆全人类
    • chrome代码的编译和调试(全部过程经本人亲自验证)
    • windows下搭建android开发环境-史上最正确最清楚版
    • 简单谈一谈字符编码这点事儿
    • 这一年,过的快–我的2014年终总结
    • 个人角度谈一点对go和erlang两门语言的体会
    • 自己验证过的centos上protobuf安装过程
    • 从高级语言学起还是从c学起?
技术宅的思考
本周
    • 大数据时代企业腾飞的利器:接入一套高效的外部数据系统来辅助决策
    • 好马还需要配好鞍-现代化数据体系架构是企业在大数据时代取胜的关键
    • 细说互联网大数据时代蕴藏的创业机会
    • 盛大游戏高管再变动:董事长兼CEO谭群钊离职
    • 360搜索被指偷来的“市场第二”
    • 疑似PPS代理公司声明曝光:曾讨论收购PPTV
    • 网谣传盛大游戏,盛大在线将打包被360收购,良知网友诅咒造谣者:造谣死全家
    • 谁为京东苏宁的价格战埋单?
    • 硅谷创业公司出奇招,直接用函数作为招聘广告的标题
    • 传雅虎CEO梅耶尔要为每位员工配备iPhone
创业动态
本周
    • 密码保护:Chromium代码下载编译
    • 过去几年很火的万门大学倒闭,创始人童哲连夜跑路
    • 字节跳动裁撤投资部,反垄断改革举措继续深入
    • 2015年,年终小结
    • 国内访问gmail的方法
    • 那些年,我开发过的约炮软件-由陌陌上市谈谈im产品这点事儿
    • linux共享动态库中同名对象重复析构-两次析构或多次析构的解决办法
    • 周鸿祎冰水浇头,接受als慈善冰桶挑战
    • 一场地方网站的盛宴-5.10日车库咖啡地方站长沙龙小记
    • 一个比较靠谱的awk的学习笔记
联系我们

关于 / 关于本站

本站由 WordPress 驱动 ,主题由SoftUses 提供技术支持
沪ICP备11048881号-1

©2025