linux 下同名符号冲突问题解决方案

 更新时间:2017年06月15日 11:41:06   投稿:lqh  
这篇文章主要介绍了 linux 下同名符号冲突问题解决方案的相关资料,需要的朋友可以参考下

linux 下同名符号冲突问题解决方案

最近的工作中遇到如下的问题:

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.重新编译连接三个模块,问题解决。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

相关文章

  • Linux使用zsh提高效率的5条建议

    Linux使用zsh提高效率的5条建议

    今天小编就为大家分享一篇关于Linux使用zsh提高效率的5条建议,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • Linux中使用expect脚本实现远程机器自动登录

    Linux中使用expect脚本实现远程机器自动登录

    本篇文章给大家介绍在Linux中使用expect脚本实现远程机器自动登录,前提是要创建一个expec脚本ssh_expect,接下来定义一些命令别名等,下面跟着脚本之家小编一起学习学习吧
    2015-09-09
  • 使用shell脚本分析网站日志统计PV、404、500等数据

    使用shell脚本分析网站日志统计PV、404、500等数据

    这篇文章主要介绍了使用shell脚本分析网站日志统计PV(浏览量)、404、500等数据,用一个脚本来实现,需要的朋友可以参考下
    2014-05-05
  • 每天一个linux命令 head命令

    每天一个linux命令 head命令

    这篇文章主要为大家详细介绍了一个linux命令:head命令,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-02-02
  • rsync结合find技巧分享

    rsync结合find技巧分享

    这条指会找到/home 及其子目录下,所有的*.sh文件,并将备分到/backupdir这个目录
    2013-01-01
  • Shell中的函数、函数定义、作用域问题介绍

    Shell中的函数、函数定义、作用域问题介绍

    这篇文章主要介绍了Shell中的函数、函数定义、作用域问题介绍,本文讲解了Shell中函数的定义、自定义函数的例子、作用域问题等内容,需要的朋友可以参考下
    2014-11-11
  • shell脚本实现的网站日志分析统计(可以统计9种数据)

    shell脚本实现的网站日志分析统计(可以统计9种数据)

    这篇文章主要介绍了shell脚本实现的网站日志分析统计,可以统计9种数据,如访问量、带宽、访客量、IP统计、搜索引擎等,需要的朋友可以参考下
    2014-05-05
  • Linux shell查找文件显示行号和对应区间的内容

    Linux shell查找文件显示行号和对应区间的内容

    今天小编就为大家分享一篇关于Linux shell查找文件显示行号和对应区间的内容,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • 解决linux 所有命令无法使用的问题

    解决linux 所有命令无法使用的问题

    今天小编就为大家分享一篇解决linux 所有命令无法使用的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • linux shell将变量拼接到命令中

    linux shell将变量拼接到命令中

    本文主要介绍了linux shell将变量拼接到命令中,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05

最新评论