嵌入式linux学习笔记-- 记录一种dlopen 打开的动态库无法被卸载的情形,情形分析以及对应的解决方法
项目中使用了rapidjson 的库函数,然后将这个库分别编译进入了不同的动态库中,然后产品的动态库设计上要能实现动态的卸载和装载 然后就遇到了问题。
具体的表现就是 打开的动态库无法被卸载。
工程的获取地址如下:
https://gitee.com/jeasonb/dlclose
建议实际运行一下工程体验一下
工程框图 如下
解决方法
# 编译选项中 加入 -fno-gnu-unique
# set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} "-fno-gnu-unique" )
# set(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} "-fno-gnu-unique" )
以上截图的语句中的 -fno-gnu-unique 语句是解决问题的关键
详细的解释可以参考这里
https://www.shuzhiduo.com/A/A7zgRmxld4/
引发问题的关键点就是
STB_GNU_UNIQUE属性的符号,在链接时只会有一份,即使这些符号分布在不同的so之间。就算由于模板函数中的静态变量是STB_GNU_UNIQUE属性,导致改模板函数即使在不同的so中各实例化了一份代码,也要使用同一个静态变量。
效果演示
前后两次运行工程的主要差异就是这里 加了 编译选项可以正常卸载,不加编译选项不能卸载!!!!!
1. 无法卸载的情形
[xxx@xxx:~/rapidjsonTest/build → master]$ ./app
liblib1.so loaded ...
testFun ... a= 1235
liblib2.so loaded ...
testFun ... a= 1236
p1 = 0x1d89030
p2 = 0x1d89670
func1 = 0x7f7abbdfda25
func2 = 0x7f7abbbfba25
this is 1 ... a = 1
this is 1 ... a = 2
this is 1 ... a = 3
this is 1 ... a = 4
this is 1 ... a = 5
this is 1 ... a = 6
this is 1 ... a = 7
this is 2 ... a = 1
this is 2 ... a = 2
this is 2 ... a = 3
this is 2 ... a = 4
this is 2 ... a = 5
this is 2 ... a = 6
liblib2.so unloaded .....
liblib2.so loaded ...
testFun ... a= 1237
p1 = 0x1d89030
p2 = 0x1d89670
func1 = 0x7f7abbdfda25
func2 = 0x7f7abbbfba25
this is 1 ... a = 8
this is 1 ... a = 9
this is 1 ... a = 10
this is 1 ... a = 11
this is 1 ... a = 12
this is 1 ... a = 13
this is 1 ... a = 14
this is 2 ... a = 1
this is 2 ... a = 2
this is 2 ... a = 3
this is 2 ... a = 4
this is 2 ... a = 5
this is 2 ... a = 6
liblib2.so unloaded .....
liblib2.so loaded ...
testFun ... a= 1238
p1 = 0x1d89030
p2 = 0x1d89670
func1 = 0x7f7abbdfda25
func2 = 0x7f7abbbfba25
this is 1 ... a = 15
this is 1 ... a = 16
this is 1 ... a = 17
this is 1 ... a = 18
this is 1 ... a = 19
this is 1 ... a = 20
this is 1 ... a = 21
this is 2 ... a = 1
this is 2 ... a = 2
this is 2 ... a = 3
this is 2 ... a = 4
this is 2 ... a = 5
this is 2 ... a = 6
liblib2.so unloaded .....
liblib2.so loaded ...
testFun ... a= 1239
p1 = 0x1d89030
p2 = 0x1d89670
func1 = 0x7f7abbdfda25
func2 = 0x7f7abbbfba25
this is 1 ... a = 22
this is 1 ... a = 23
this is 1 ... a = 24
this is 1 ... a = 25
this is 1 ... a = 26
this is 1 ... a = 27
this is 1 ... a = 28
this is 2 ... a = 1
this is 2 ... a = 2
this is 2 ... a = 3
this is 2 ... a = 4
this is 2 ... a = 5
this is 2 ... a = 6
liblib2.so unloaded .....
liblib2.so loaded ...
testFun ... a= 1240
p1 = 0x1d89030
p2 = 0x1d89670
func1 = 0x7f7abbdfda25
func2 = 0x7f7abbbfba25
this is 1 ... a = 29
this is 1 ... a = 30
this is 1 ... a = 31
this is 1 ... a = 32
this is 1 ... a = 33
this is 1 ... a = 34
this is 1 ... a = 35
this is 2 ... a = 1
this is 2 ... a = 2
this is 2 ... a = 3
this is 2 ... a = 4
this is 2 ... a = 5
this is 2 ... a = 6
liblib2.so unloaded .....
liblib2.so loaded ...
testFun ... a= 1241
p1 = 0x1d89030
p2 = 0x1d89670
func1 = 0x7f7abbdfda25
func2 = 0x7f7abbbfba25
this is 1 ... a = 36
this is 1 ... a = 37
this is 1 ... a = 38
this is 1 ... a = 39
this is 1 ... a = 40
this is 1 ... a = 41
this is 1 ... a = 42
this is 2 ... a = 1
this is 2 ... a = 2
this is 2 ... a = 3
this is 2 ... a = 4
this is 2 ... a = 5
this is 2 ... a = 6
liblib2.so unloaded .....
liblib2.so loaded ...
testFun ... a= 1242
p1 = 0x1d89030
p2 = 0x1d89670
func1 = 0x7f7abbdfda25
func2 = 0x7f7abbbfba25
this is 1 ... a = 43
this is 1 ... a = 44
this is 1 ... a = 45
this is 1 ... a = 46
this is 1 ... a = 47
this is 1 ... a = 48
this is 1 ... a = 49
this is 2 ... a = 1
this is 2 ... a = 2
this is 2 ... a = 3
this is 2 ... a = 4
this is 2 ... a = 5
this is 2 ... a = 6
liblib2.so unloaded .....
2. 可以卸载的情形
[xxx@xxxx:~/rapidjsonTest/build → master]$ ^C
[xxx@xxx:~/rapidjsonTest/build → master]$ make
-- Configuring done
-- Generating done
-- Build files have been written to: /home/xxx/rapidjsonTest/build
Scanning dependencies of target lib2
[ 16%] Building CXX object CMakeFiles/lib2.dir/2.cpp.o
[ 33%] Linking CXX shared library liblib2.so
[ 33%] Built target lib2
Scanning dependencies of target lib1
[ 50%] Building CXX object CMakeFiles/lib1.dir/1.cpp.o
[ 66%] Linking CXX shared library liblib1.so
[ 66%] Built target lib1
[ 83%] Building CXX object CMakeFiles/app.dir/main.cpp.o
[100%] Linking CXX executable app
[100%] Built target app
[xxx@xxxx:~/rapidjsonTest/build → master]$ ./app
liblib1.so loaded ...
testFun ... a= 1235
liblib2.so loaded ...
testFun ... a= 1235
p1 = 0x12c9030
p2 = 0x12c9670
func1 = 0x7f6018b52a25
func2 = 0x7f6018950a25
this is 1 ... a = 1
this is 1 ... a = 2
this is 1 ... a = 3
this is 1 ... a = 4
this is 1 ... a = 5
this is 1 ... a = 6
this is 1 ... a = 7
this is 2 ... a = 1
this is 2 ... a = 2
this is 2 ... a = 3
this is 2 ... a = 4
this is 2 ... a = 5
this is 2 ... a = 6
liblib1.so unloaded .....
liblib2.so unloaded .....
liblib1.so loaded ...
testFun ... a= 1235
liblib2.so loaded ...
testFun ... a= 1235
p1 = 0x12c9010
p2 = 0x12c9670
func1 = 0x7f6018b52a25
func2 = 0x7f6018950a25
this is 1 ... a = 1
this is 1 ... a = 2
this is 1 ... a = 3
this is 1 ... a = 4
this is 1 ... a = 5
this is 1 ... a = 6
this is 1 ... a = 7
this is 2 ... a = 1
this is 2 ... a = 2
this is 2 ... a = 3
this is 2 ... a = 4
this is 2 ... a = 5
this is 2 ... a = 6
liblib1.so unloaded .....
liblib2.so unloaded .....
liblib1.so loaded ...
testFun ... a= 1235
liblib2.so loaded ...
testFun ... a= 1235
p1 = 0x12c9010
p2 = 0x12c9670
func1 = 0x7f6018b52a25
func2 = 0x7f6018950a25
this is 1 ... a = 1
this is 1 ... a = 2
this is 1 ... a = 3
this is 1 ... a = 4
this is 1 ... a = 5
this is 1 ... a = 6
this is 1 ... a = 7
this is 2 ... a = 1
this is 2 ... a = 2
this is 2 ... a = 3
this is 2 ... a = 4
this is 2 ... a = 5
this is 2 ... a = 6
liblib1.so unloaded .....
liblib2.so unloaded .....
liblib1.so loaded ...
testFun ... a= 1235
liblib2.so loaded ...
testFun ... a= 1235
p1 = 0x12c9010
p2 = 0x12c9670
func1 = 0x7f6018b52a25
func2 = 0x7f6018950a25
this is 1 ... a = 1
this is 1 ... a = 2
this is 1 ... a = 3
this is 1 ... a = 4
this is 1 ... a = 5
this is 1 ... a = 6
this is 1 ... a = 7
this is 2 ... a = 1
this is 2 ... a = 2
this is 2 ... a = 3
this is 2 ... a = 4
this is 2 ... a = 5
this is 2 ... a = 6
liblib1.so unloaded .....
liblib2.so unloaded .....
liblib1.so loaded ...
testFun ... a= 1235
liblib2.so loaded ...
testFun ... a= 1235
p1 = 0x12c9010
p2 = 0x12c9670
func1 = 0x7f6018b52a25
func2 = 0x7f6018950a25
this is 1 ... a = 1
this is 1 ... a = 2
this is 1 ... a = 3
this is 1 ... a = 4
this is 1 ... a = 5
this is 1 ... a = 6
this is 1 ... a = 7
this is 2 ... a = 1
this is 2 ... a = 2
this is 2 ... a = 3
this is 2 ... a = 4
this is 2 ... a = 5
this is 2 ... a = 6
liblib1.so unloaded .....
liblib2.so unloaded .....
liblib1.so loaded ...
testFun ... a= 1235
liblib2.so loaded ...
testFun ... a= 1235
p1 = 0x12c9010
p2 = 0x12c9670
func1 = 0x7f6018b52a25
func2 = 0x7f6018950a25
this is 1 ... a = 1
this is 1 ... a = 2
this is 1 ... a = 3
this is 1 ... a = 4
this is 1 ... a = 5
this is 1 ... a = 6
this is 1 ... a = 7
this is 2 ... a = 1
this is 2 ... a = 2
this is 2 ... a = 3
this is 2 ... a = 4
this is 2 ... a = 5
this is 2 ... a = 6
liblib1.so unloaded .....
liblib2.so unloaded .....
liblib1.so loaded ...
testFun ... a= 1235
liblib2.so loaded ...
testFun ... a= 1235
p1 = 0x12c9010
p2 = 0x12c9670
func1 = 0x7f6018b52a25
func2 = 0x7f6018950a25
this is 1 ... a = 1
this is 1 ... a = 2
this is 1 ... a = 3
this is 1 ... a = 4
this is 1 ... a = 5
this is 1 ... a = 6
this is 1 ... a = 7
this is 2 ... a = 1
this is 2 ... a = 2
this is 2 ... a = 3
this is 2 ... a = 4
this is 2 ... a = 5
this is 2 ... a = 6
liblib1.so unloaded .....
liblib2.so unloaded .....
liblib1.so loaded ...
testFun ... a= 1235
liblib2.so loaded ...
testFun ... a= 1235
p1 = 0x12c9010
p2 = 0x12c9670
func1 = 0x7f6018b52a25
func2 = 0x7f6018950a25
this is 1 ... a = 1
this is 1 ... a = 2
this is 1 ... a = 3
this is 1 ... a = 4
this is 1 ... a = 5
this is 1 ... a = 6
this is 1 ... a = 7
this is 2 ... a = 1
this is 2 ... a = 2
this is 2 ... a = 3
this is 2 ... a = 4
this is 2 ... a = 5
this is 2 ... a = 6
liblib1.so unloaded .....
liblib2.so unloaded .....
^C
[xxx@xxxx:~/rapidjsonTest/build → master]$
嵌入式linux学习笔记-- 记录一种dlopen 打开的动态库无法被卸载的情形,情形分析以及对应的解决方法相关推荐
- 迅为嵌入式Linux学习笔记4——进程
迅为嵌入式Linux学习笔记4--进程 进程指的是正在运行的程序,是操作系统分配资源的最小单位. 进程ID 每个进程都有唯一的标识符,这个标识符就是进程ID,简称pid 进程间通信的方法 管道通信:分 ...
- 迅为嵌入式Linux学习笔记5——进程间通信
迅为嵌入式Linux学习笔记5--进程间通信 管道通信 无名管道 无名管道只能实现有亲缘关系的进程之间的通信,比如父子进程. pipe函数: #include <unistd.h> int ...
- 嵌入式linux学习笔记--TCP通讯整理
嵌入式linux学习笔记–TCP通讯整理 之前的项目中使用到了比较多的tcp 通讯相关的知识,一直也没有进行整理,今天准备拿出时间好好的整理一下TCP通讯的整个过程.预计会整理linux和window ...
- 嵌入式linux学习笔记-- 对于动态库的一些操作 dlopen
最近公司重构代码,看到了公司的一位经验丰富的工程师的一些C++ 操作 属实有被秀到,估计光看他写的代码都够我写很多总结了. 根据他写的代码以及公司未来的代码的一些规划 我也总结一些无关痛痒的知识吧. ...
- 嵌入式Linux学习笔记—fastboot烧写Android
本系列为本人在自学过程中的学习笔记,如有错误欢迎大家指正. 学习资料为讯为ITOP4412开发板. fastboot烧写Android 1.主要工具 OTG 接口烧写方式也叫 fastboot 烧写方 ...
- 【linux学习笔记】嵌入式linux学习笔记
目录: 1.SWAP 交换分区 2.GRUB 3.块设备和字符设备 4.shell 7.静态函数库\动态库 8.交叉编译 9.系统调用 10.文件 I/O编程 11.进程和线程 12.磁盘和文件系 ...
- 嵌入式linux学习笔记(一)
最近开始学习linux驱动编写,目前直接使用jz2440已移植好的系统配合视频开始学习驱动编写,但是总是出现这样那样的问题.于是决定重头开始,先自己移植内核,在开始驱动学习. 今天参照<嵌入式l ...
- 嵌入式Linux学习笔记(1-2)——vi编辑器
vi编辑器是linux系统自带的文本编辑工具,它小巧玲珑,很多开发者对其爱不释手.不过由于大部分程序员已经习惯在windows上使用各种功能更强大的文本编辑器编写代码,转而使用vi编辑器写代码是一件特 ...
- 嵌入式Linux学习笔记(1-1)——linux系统搭建
版权声明:本文为博主原创文章,未经博主允许不得转载. 学习嵌入式linux已经有2年时间,虽然时间不长,但一路走来遇到很多问题,绕了很多弯路.写这篇文章的目的是分享我的经验,以供初学者参考,希望能够帮 ...
- 嵌入式linux编程,嵌入式Linux学习笔记 - 嵌入式Linux基础知识和开发环境的构建_Linux编程_Linux公社-Linux系统门户网站...
注:所有内容基于友善之臂Mini2440开发板 一.嵌入式Linux开发环境的构建 嵌入式开发一般分为三个步骤: 1.编译bootloader,烧到开发板 2.编译嵌入式Linux内核,烧到开发板 3 ...
最新文章
- MySQL存储写入速度慢分析
- Android表格布局(Table Layout)
- 《现代操作系统》第4章读书笔记--文件系统(未完成)
- YTU 2586: 填空题B-字画鉴别
- 《磨难之间》——刻意设计,缺失核心
- 对python编程做介绍-python002-编程语言介绍
- 2018年NLP技术学习总结
- java web重定向_Javaweb学习之资源重定向与请求转发
- Android项目中嵌入Cocos游戏项目
- 河北源达投顾:用专业教学,用智能解决选股烦恼
- 小程序页面简单功能模块化之取整
- 【JavaScript】为什么是script error.
- lua报错:1: unfinished string near ‘<eof>‘
- R语言ggridges包绘制漂亮的峰峦图(山脊图)-下篇
- 李峋同款爱心代码Python版
- 拓嘉辰丰:拼多多直播推广的付费模式有哪些?
- 平安好房想灭房产中介靠不靠谱?
- 21天战拖记——Day21:《小强升职记》学习感受(2014-05-24)
- Accurate, Dense, and Robust Multi-View Stereopsis论文分析与代码实现(一)
- 定时向QQ推送天气消息
热门文章
- Unity 之 图集属性详解和代码示例 -- 拓展一键自动打包图集工具
- python中os.path.join()路径的注意点
- matlab分析裂纹图像,matlab裂纹识别,关键代码
- 第4课 - 顶层父类的创建
- OrionX(猎户座)AI加速器资源池化软件赋能深度学习分布式训练
- 在这个多变的职场环境下,如何能够更加高效的学习
- 香港中文大学计算机辅助翻译课程,港中文翻译(MA in Translation)专业申请解析...
- (赠源码)springboot+Mysql流浪动物救助系统78174-计算机毕业设计
- 自适应的世界:带你了解CSS3中的四大元素尺寸属性值:fit-content / fill-available / max-content / min-content.
- html.gmt文件,[转载]使用GMT的psxy命令画各种符号