最近的工作中遇到如下令人蛋疼的问题:
linux 下有三个模块aa、bb、cc,基本情况如下:
cc 编译连接得到 cc.so 动态库,cc 中有如下接口: cc_fun { …… do();//调用名为do的cc模块内部函数 …… } bb 编译连接得到 bb.a 静态库,bb 中有如下接口: bb_fun { …… handle = dlopen(cc.so, RTLD_LAZY);//加载cc.so pccfun = dlsym(handle, "cc_fun");//获取cc_fun函数指针 (*pccfun)();//调用cc_fun函数,此时应该会调用cc模块中的do()函数 do();//调用名为do的bb模块内部函数(与cc模块中的do()函数同名,实现却不相同) …… } aa 编译后通过 -lbb 链接选项的方式连接 bb.a 得到 aa 可执行程序,并调用 bb.a 的接口函数 bb_fun(): main { …… bb_fun();//调用bb_fun函数 …… } 工作中发现 aa 在运行时行为异常,总是有内存泄露和功能异常,通过定位发现问题集中在同名的 do() 函数上。通过输出打印发现程序中两次调用 do() 函数都调用到了 bb 模块中的 do() 函数,而 cc 模块中的 do() 函数从未被调用到,导致程序行为异常和内存泄露。
后经多方查证了解到因为 linux 程序中各个库中的符号表最终都会加载到程序所在的全局符号表中,此时如果有同名符号就只能调用到第一个加载进来的符号,也就是说后边加载的同名符号都会被之前的覆盖。cc 模块中的 do() 函数被 bb 模块中的 do() 函数覆盖了,所以无法被调用到。
废话不多说。。。
在试验过很多不满意的方法之后,最终的解决方法如下:
1.在 cc 的 makefile 中加入 -Wl,-Bsymbolic -Wl,--version-script,version 的连接选项,意思是用 version 文件中的脚本指定其导出哪些函数。
2.version 文件的实现如下: VERS{ global: cc_fun; local: *; }; 意思是指定 cc 模块只导出接口函数 cc_fun,其余函数都设为 local 不做导出。
将该文件保存在 makefile 所在目录即可。
3.重新编译连接三个模块,问题解决。
O(∩_∩)O哈哈~,蛋,终于不疼了。
发表评论
-
一个字符串问题的思考
2012-07-06 09:51 497一、 问题描述: 求解给定文本text 中以字符 A ... -
Vim正则表达式查找替换
2012-07-06 09:45 934这里简单的给大家介绍一下Vim的查找替换,众所周知,Vim ... -
使用正则表达式实现表达式计算器
2012-07-06 09:37 1234使用正则表达式实 ... -
VTK使用入门(四)
2012-07-06 09:30 1770#include "vtkDICOMImageR ... -
页面仿百度下拉框,支持动态后台提取数据
2012-07-05 20:44 998.bottom_up { font-family ... -
核心Swing组件(五)
2012-07-03 13:42 563如图4-1所示,AbstractButton类是作用在幕后 ... -
Flex 文件上传导入组件
2012-07-02 10:22 334上文讲到Flex利用Blazeds来上传文件,本文则封装了 ... -
flex分页控件源码
2012-07-02 10:22 563功能说明:只配合服务器端分页。这个分页条是通用的。只需要在 ... -
自定义网页滚动条
2012-07-02 10:21 522用户操作 [留言] [发消息] [加为好友] ... -
Three ways to set a custom busy cursor in flex
2012-07-02 10:21 507First, prepare your custom cu ... -
Android
2012-07-02 09:43 446... -
PHP作为Flex程序的数据源
2012-07-01 09:41 446Adobe Flash Builder 4 简体中文正式版 ... -
Flex和Spring的整合
2012-07-01 09:41 391关于Flex Adobe Flex是一套创建富客户端应用( ... -
实现FLEX 通过AMF跟PHP通信
2012-07-01 09:41 517AMF flex一种远调用 ... -
Java Server Push To Flex (ServerPush)
2012-07-01 09:40 514在网上找了许多的Flex与java 通信做ServerPu ... -
在xp和Win7上使用Tomcat 6.0经常遇到的几个问题及其解决方法
2012-06-30 17:56 497在Win7上使用Tomcat 6.0经常会遇到一下几个问题 ... -
找到多个具有相同 ID“_header”的控件。FindControl 要求控件具有唯一的 ID。错误的解决方法!
2012-06-30 17:56 529找到多个具有相 ... -
DB2相关问题及解决方法
2012-06-30 17:56 495DB2相关问题及解决方法: 一、DB2中的代码页( ... -
session串的问题以及解决方法
2012-06-30 17:56 561什么是session串的问题 典型案例:现有一W ...
相关推荐
主要介绍了 linux 下同名符号冲突问题解决方案的相关资料,需要的朋友可以参考下
Linux动态库 同名符号,可以参考一下。
linux查看同名的进程 linux查看同名的进程数
多个类注解@XStreamAlias,value相同、且在集合上使用了@XStreamImplicit会出现异常: ... No field 'null' found in class '.....(注解的类路径)' ---- Debugging information ---- ...该包解决了这个bug
主要为大家详细介绍了TP3.2批量上传文件或图片,同名冲突问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
故重新打包 XmlSchema-1.1.jar 源码修改原类径的方法来重新打包避免冲突 源码放在javas.rar文件夹中 org.codehaus.xfire.wsdl11.parser.SchemaInfo org.codehaus.xfire.wsdl11.parser.WSDLServiceBuilder org....
故重新打包 XmlSchema-1.1.jar 源码修改原类径的方法来重新打包避免冲突 源码放在javas.rar文件夹中 org.codehaus.xfire.wsdl11.parser.SchemaInfo org.codehaus.xfire.wsdl11.parser.WSDLServiceBuilder org....
故重新打包 XmlSchema-1.1.jar 源码修改原类径的方法来重新打包避免冲突 源码放在javas.rar文件夹中 org.codehaus.xfire.wsdl11.parser.SchemaInfo org.codehaus.xfire.wsdl11.parser.WSDLServiceBuilder org....
Spring MVC中的参数绑定还是蛮重要的,最近在使用中遇到了同名参数绑定的问题,想着总结分享出来,下面这篇文章主要给大家介绍了关于Spring MVC同名参数绑定问题的解决方法,需要的朋友可以参考借鉴,下面来一起看看...
解决了类似QQ同名登陆的问题 如有问题请跟我说
主要介绍了解决vue路由name同名,路由重复的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
* @description:类实现接口的冲突问题 */ interface B{ fun x(): Int = 1 } interface C{ fun x(): Int = 0 } /**一个类实现了两个接口,两个接口中的方法相同,这个类在覆写的时候就会出现冲突*/ class D: B,C{...
Linux考试题(同名17606).doc
C语言函数调用过程中变量的同名问题的解决
绝密_链接编译报错 2个静态库包含同名函数的处理方法 ,常用于嵌入式 移植开发过程中 静态库 相同函数 重复定义的error
idea最新版本2.5在搜狗输入法中文状态下卡顿现象已经解决 下载后替换搜狗安装路径下同名文件
项目启动后访问页面,页面显示Uncaught initialization Exception created by servlet这个错误.查看日志会报找不到index()的异常。
介绍同名端的简易判别方法,是自己日常运用的经验之谈,对于新手将是一个不错的学习机会
U盘文件夹都变成同名的.exe文件,这是U盘幽灵病毒。我的方法亲自试过,一下就好了。
用C#语言写的数字图像处理程序,提供了俩种方法提取同名点