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

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

(0)

相关推荐

  • linux系统下ubuntu重启apache服务命令

    在Linux中要重启apache服务与在windows是有很大的区别,下面我们来介绍一下常用的命令 linux系统为Ubuntu 一.Start Apache 2 Server /启动apache服务 /etc/init.d/apache2 start or $ sudo /etc/init.d/apache2 start 二. Restart Apache 2 Server /重启apache服务 /etc/init.d/apache2 restart or $ sudo /etc/init.

  • 基于Linux系统中python matplotlib画图的中文显示问题的解决方法

    最近想学习一些python数据分析的内容,就弄了个爬虫爬取了一些数据,并打算用Anaconda一套的工具(pandas, numpy, scipy, matplotlib, jupyter)等进行一些初步的数据挖掘和分析. 在使用matplotlib画图时,横坐标为中文,但是画出的条形图横坐标总是显示"框框",就去查资料解决.感觉这应该是个比较常见的问题,网上的中文资料也确实很多,但是没有任何一个彻底解决了我遇到的问题.零零碎碎用了快3个小时的时间,才终于搞定.特此分享,希望能帮到有同

  • linux定时任务访问url实例

    这次linux定时任务设置成功,也算是自己学习linux中一个小小的里程碑.:) 撒花撒花--- 以下操作均是在ubuntu 下操作的,亲测有效,其他的linux系统还望亲们自己去查.鞠躬感谢! 1.进入crontab文件的编写状态: crontab -e 2.第一次进入编写crontab文件的界面,系统会提示选择相应的编辑器,一般我们选择vi编辑器就可以了:选择/usr/bin/vim.tiny Select an editor. To change later, run 'select-ed

  • 解决Linux系统中python matplotlib画图的中文显示问题

    最近想学习一些python数据分析的内容,就弄了个爬虫爬取了一些数据,并打算用Anaconda一套的工具(pandas, numpy, scipy, matplotlib, jupyter)等进行一些初步的数据挖掘和分析. 在使用matplotlib画图时,横坐标为中文,但是画出的条形图横坐标总是显示"框框",就去查资料解决.感觉这应该是个比较常见的问题,网上的中文资料也确实很多,但是没有任何一个彻底解决了我遇到的问题.零零碎碎用了快3个小时的时间,才终于搞定.特此分享,希望能帮到有同

  • linux下安装nodejs及npm的方法

    1.下载npm包 官网下载npm安装包,https://nodejs.org/en/,左边是稳定版右边是最新版. 2.解压,创建链接 将压缩包解压到/opt(一般软件放在该目录)目录下.可以看到bin目录下有两个可执行文件node和npm,在/usr/local/bin中创建该文件的链接 sudo ln -s /opt/node-v0.12.10-linux-x86/bin/node /usr/local/bin/node sudo ln -s /opt/node-v0.12.10-linux

  • Linux 在Shell脚本中使用函数实例详解

    Linux 在Shell脚本中使用函数实例详解 Shell的函数 Shell程序也支持函数.函数能完成一特定的功能,可以重复调用这个函数. 函数格式如下: 函数名() { 函数体 } 函数调用方式: 函数名 参数列表 实例:编写一函数add求两个数的和,这两个数用位置参数传入,最后输出结果. root@ubuntu:/home/study# vi test3 #!/bin/bash add(){ a=$1; b=$2; z=`expr $a + $b`; echo "The sum is $z&

  • VirtualBox安装Archlinux并配置桌面环境

    最近无聊,就找来archlinux来玩一玩,去archlinux wiki上看了一下教程.以下是操作过程. 1. 下载镜像,下载地址; 2. 启动archlinux并选择Boot Arch Linux,然后就会进入字符安装界面; 3. 联网并安装基础系统: 1).联网并测试: root@archiso ~ # dhcpcd root@archiso ~ # ping archlinux.org -c 4 2).更新系统时间: root@archiso ~ # timedatectl set-nt

  • 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, "c

  • linux下mysql乱码问题的解决方案

    项目进行到和服务器交互,通过post访问服务器端jsp,jsp访问服务器端mysql数据库,最终返回到客户端的中文出现乱码问题. 在整个流程中,出现错误的原因可能是三个:post未设置编码或者编码不相符合,jdbc出现问题,linux下mysql初始码制问题. 在经过繁琐的排查后,最终确定问题为mysql编码问题.下文介绍如何解决linux下mysql中文乱码问题. 首先进入mysql命令行模式,键入mysql -uroot -p 即可进入.随后键入 SHOW VARIABLES LIKE 'c

  • Linux下乱码问题的解决方案小结

    linux系统中文件名内容为urf8编码, windows系统中文件名默认为gbk编码, 多数文档使用gbk编码,系统采用utf8编码 无中文输入法导致的乱码 1.ibus输入法 Ubuntu 系统安装后已经自带了ibus输入法,在英语环境下默认不启动.配置ibus自动启动可以在ubuntu系统菜单上选择System --- Preferences --- Startup Applications,在该窗口中增加一个程序: Name: ibus-daemon Command: ibus-daem

  • linux下用cron定时执行任务的方法

    名称 : crontab 使用权限 : 所有使用者 使用方式 : crontab file [-u user]-用指定的文件替代目前的crontab. crontab-[-u user]-用标准输入替代目前的crontab. crontab-1[user]-列出用户目前的crontab. crontab-e[user]-编辑用户目前的crontab. crontab-d[user]-删除用户目前的crontab. crontab-c dir- 指定crontab的目录. crontab文件的格式

  • linux 下的yum命令详解

    yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器.基於RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软体包,无须繁琐地一次次下载.安装.yum提供了查找.安装.删除某一个.一组甚至全部软件包的命令,而且命令简洁而又好记. yum的命令形式一般是如下:yum [options] [command] [package ...] 其中的[opt

  • php中并发读写文件冲突的解决方案

    对于日IP不高或者说并发数不是很大的应用,一般不用考虑这些!用一般的文件操作方法完全没有问题.但如果并发高,在我们对文件进行读写操作时,很有可能多个进程对进一文件进行操作,如果这时不对文件的访问进行相应的独占,就容易造成数据丢失.例如:一个在线聊天室(这里假定把聊天内容写入文件),在同一时刻,用户A和用户B都要操作数据保存文件,首先是A打开了文件,然后更新里面的数据,但这里B也正好也打开了同一个文件,也准备更新里面的数据.当A把写好的文件保存时,这里其实B已经打开了文件.但当B再把文件保存回去时

  • 解析Linux下C++编译和链接

    编译原理 将如下最简单的C++程序(main.cpp)编译成可执行目标程序,实际上可以分为四个步骤:预处理.编译.汇编.链接,可以通过 g++ main.cpp –v看到详细的过程,不过现在编译器已经把预处理和编译过程合并. 预处理:g++ -E main.cpp -o main.ii,-E表示只进行预处理.预处理主要是处理各种宏展开:添加行号和文件标识符,为编译器产生调试信息提供便利:删除注释:保留编译器用到的编译器指令等. 编译:g++ -S main.ii –o main.s,-S表示只编

  • Linux下VMware workstation的3种使用技巧

    很多人都说虚拟机不易管理,原因是我们对于虚拟化的使用技巧掌握的还不是很好.今天,我们就来看三个Linux下的VMware workstation使用技巧. VMware workstation使用技巧一.实现VMWare桥接无线网卡上网,不再只限于用NAT 环境:宿主机为UBUNTU8.04_amd64,VMware workstation 6.0.x 在UBUNTU下(实际上是在LINUX作宿主机的情况下)使用VMWare一直有两个大家公认的问题:一是声卡占用的问题:二是桥接无线网卡的问题.关

  • 详解linux下tree命令的用法

    tree命令,主要功能是创建文件列表,将所有文件以树的形式列出来 linux下的tree就比较强大了,但一般系统并不自带这个命令,需要手动下载安装, 安装 : yum -y install tree -a 显示所有文件和目录. -A 使用ASNI绘图字符显示树状图而非以ASCII字符组合. -C 在文件和目录清单加上色彩,便于区分各种类型. -d 显示目录名称而非内容. -D 列出文件或目录的更改时间. -f 在每个文件或目录之前,显示完整的相对路径名称. -F 在执行文件,目录,Socket,

  • Linux 下xargs命令详解及xargs与管道的区别

    为什么要用xargs,问题的来源 在工作中经常会接触到xargs命令,特别是在别人写的脚本里面也经常会遇到,但是却很容易与管道搞混淆,本篇会详细讲解到底什么是xargs命令,为什么要用xargs命令以及与管道的区别.为什么要用xargs呢,我们知道,linux命令可以从两个地方读取要处理的内容,一个是通过命令行参数,一个是标准输入.例如cat.grep就是这样的命令,举个例子: echo 'main' | cat test.cpp 这种情况下cat会输出test.cpp的内容,而不是'main'

随机推荐