社区
Linux/Unix社区
帖子详情
.so的动态卸载与替换问题
spymin812
2010-12-25 07:27:24
加精
一个正在运行的程序调用了一个.so文件,现在要用有新的.so替换旧的.so文件,在不关闭程序的情况下,如何替换
就是如何动态的卸载旧库并替换为新库加载,中途不关闭程序
...全文
3295
46
打赏
收藏
.so的动态卸载与替换问题
一个正在运行的程序调用了一个.so文件,现在要用有新的.so替换旧的.so文件,在不关闭程序的情况下,如何替换 就是如何动态的卸载旧库并替换为新库加载,中途不关闭程序
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
46 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
okbaozhen
2012-01-03
打赏
举报
回复
没看明白
fytzzh
2011-03-29
打赏
举报
回复
当然需要一些通知机制有些的so可以动态加载。
这就涉及到进程间通讯
一般可以选择使用:
信号
套接字 (如果仅仅是本地可以选择域套接字)
管道
等
只要能进程间通讯都可以
fytzzh
2011-03-29
打赏
举报
回复
ganjianh8 正解
ketao_78
2011-03-21
打赏
举报
回复
为啥要这么做
ecsape
2011-01-04
打赏
举报
回复
有趣的帖子,收藏了。
只是觉得inotify_init(),inotify_add_watch()好像有点浪费。可以用管道通讯,socket等方式在.so改变时通知程序更换。
dungeonsnd
2011-01-02
打赏
举报
回复
[Quote=引用 27 楼 feiyinzilgd 的回复:]
引用 26 楼 hzy_76 的回复:
明白了,谢谢feiyinzilgd。但不知是什么机制和函数呢?
inotify_init()
inotify_add_watch()
对特定的路径文件进行监控。当发生了变化会发送一个notify event.
这样。。
再使用一个select。就可以知道文件是否发生了改变。。。
[/Quote]
这样应该对性能有影响吧。
因为这一事件发生的次数非常少,浪费了不必要的CPU时间。
kingstarer
2011-01-01
打赏
举报
回复
重新dlopen就行了
通知程序更新方法有很多 可以通过自动比较文件修改时间 也可能通过手工发送信号通知程序
DACE2012
2010-12-31
打赏
举报
回复
这个方法好,回去试试
ZHU1113
2010-12-31
打赏
举报
回复
不明白!!!
nilite
2010-12-31
打赏
举报
回复
太奇怪了,我找遍Glibc的手册和linux kernel API手册,都没有找到这两个函数,但是可以man到,也可以在我的libc下面找到相关的头文件,27楼,请告诉我,我平时该从何处获得这些函数?
[Quote=引用 27 楼 feiyinzilgd 的回复:]
引用 26 楼 hzy_76 的回复:
明白了,谢谢feiyinzilgd。但不知是什么机制和函数呢?
inotify_init()
inotify_add_watch()
对特定的路径文件进行监控。当发生了变化会发送一个notify event.
这样。。
再使用一个select。就可以知道文件是否发生了改变。。。
[/Quote]
nilite
2010-12-31
打赏
举报
回复
我想问一下23楼,要看哪方面的资料,才能了解这些系统调用,怎么我翻glibc的手册,根本找不到这两个函数,但是man一下还是有的。
[Quote=引用 23 楼 feiyinzilgd 的回复:]
引用 15 楼 hzy_76 的回复:
有一个思路不知道Linux下是否可行,如果文件系统在文件替换时能发出中断信号,并允许程序进行干预的话,可以不用这个办法。但就我目前的水平,只能这么做。
引用 11 楼 feiyinzilgd 的回复:
引用 9 楼 hzy_76 的回复:
我觉得应该没问题,但需要程序控制,当需要更新.so文件时,等待所有调用结束后,dlclose,然后替换……
[/Quote]
arkor
2010-12-30
打赏
举报
回复
楼上已经回答了。
冷卡卡西
2010-12-29
打赏
举报
回复
参考下这个:
http://blog.163.com/xychenbaihu@yeah/blog/static/132229655201011209823241/
冷卡卡西
2010-12-29
打赏
举报
回复
[Quote=引用 27 楼 feiyinzilgd 的回复:]
引用 26 楼 hzy_76 的回复:
明白了,谢谢feiyinzilgd。但不知是什么机制和函数呢?
inotify_init()
inotify_add_watch()
对特定的路径文件进行监控。当发生了变化会发送一个notify event.
这样。。
再使用一个select。就可以知道文件是否发生了改变。。。
[/Quote]
这个方法妙。。。。
cnlm2
2010-12-29
打赏
举报
回复
dlclose
dlopen
南极星0628
2010-12-28
打赏
举报
回复
必须动态调入.so,这样直接换文件,程序重新读入即可
aguang423
2010-12-28
打赏
举报
回复
楼上正解
谭海燕
2010-12-28
打赏
举报
回复
[Quote=引用 15 楼 hzy_76 的回复:]
有一个思路不知道Linux下是否可行,如果文件系统在文件替换时能发出中断信号,并允许程序进行干预的话,可以不用这个办法。但就我目前的水平,只能这么做。
引用 11 楼 feiyinzilgd 的回复:
引用 9 楼 hzy_76 的回复:
我觉得应该没问题,但需要程序控制,当需要更新.so文件时,等待所有调用结束后,dlclose,然后替换,然后再重新dlopen。
这个方法……
[/Quote]
是的。你可以监视文件系统。 2.6内核目前已经提供了相关的函数和机制让你来监视文件系统的变化。
jiminlan521
2010-12-28
打赏
举报
回复
好资料,收藏一下。
dxh7281371
2010-12-28
打赏
举报
回复
不错的东西
加载更多回复(12)
hookso:linux
动态
链接库的注入修改查找工具 A tool for injection, modification and search of linux dynamic link library
hookso hookso是一个linux
动态
链接库的注入修改查找工具,用来修改其他进程的
动态
链接库行为。 功能 让某个进程执行系统调用 让某个进程执行.so的某个函数 给某个进程挂接新的.so
卸载
某个进程的.so 把旧.so的函数或某个地址
替换
为新.so的函数 复原.so的函数或某个地址的
替换
查找.so的函数地址 查看.so的函数参数,或某个地址的函数参数 当执行.so的某个函数时或某个地址的函数时,触发执行新的函数 编译 git clone代码,运行脚本,生成hookso以及测试程序 # ./build.sh # cd test && ./build.sh 示例 启动test目录下的测试程序 先看下测试代码,代码很简单,test.cpp不停的调用libtest.so的libtest函数 int n = 0; while (1) { if (libtest(n++)) {
【救援过程】升级openssl导致libcrypto.so.1.1
动态
库不可用
编译打包openssl-1.1.1k并给服务器升级,由于1.1.1k版本的libcrypto.so.1.1
动态
库与1.1.1g版本的不同,导致有依赖的命令均不能正常使用。 不建议自行升级openssl到1.1.1k,特别是不要
替换
libcrypto.so.1.1
动态
库。 yum、rpm命令也依赖libcrypto.so库,在救援模式下调用yum、rpm
卸载
openssl-1.1.1k也不可能。 最终提取openssl-1.1.1g归档文件,在救援模式下覆盖到相应目录,解决这个故障。 记录过程。
Android热修复原理+实现(最全方案)
本课程包含目前所有Android热修复框架的方案,深入解析各种方案原理+手动实现验证。包括代码修复(dex插桩、字节码插桩、native hook方法
替换
)、资源修复(0x66资源补丁、AssetManager对象
替换
)、so修复(接口
替换
、反射方案)。学完本课程相当于掌握了所有热修复技术原理及框架。课程内容丰富有深度,4k录制高清视频。
linux 子进程hook,hookso: hookso是一个Linux
动态
链接库的注入修改查找工具,用来修改其他进程的
动态
链接库行为...
hooksohookso是一个linux
动态
链接库的注入修改查找工具,用来修改其他进程的
动态
链接库行为。功能让某个进程执行系统调用让某个进程执行.so的某个函数给某个进程挂接新的.so
卸载
某个进程的.so把旧.so的函数
替换
为新.so的函数复原.so的函数
替换
查找.so的函数地址编译git clone代码,运行脚本,生成hookso以及测试程序# ./build.sh# cd test &...
Linux环境下
动态
库so 中全局变量冲突
问题
Linux环境下
动态
库so 中全局变量冲突
问题
项目调试过程中遇到Linux环境下
动态
库so中全局变量相互冲突
问题
,
问题
具体描述如下: 单个进程 A运行时需要加载两个
动态
库B.so与C.so ,这两个
动态
库均链接了静态库D.a。静态库 D.a存在全局变量且只能初始化一次。进程A加载B.so 正常,加载C.so 提示D.a 初始化失败。 失败的原因是C.so 使用B.so连接的D.a中全局变量。解决的办法是编译生成B.so与 C.so 时加上编译 选项-Wl,-BsymbolicBsym...
Linux/Unix社区
23,118
社区成员
74,507
社区内容
发帖
与我相关
我的任务
Linux/Unix社区
Linux/Unix社区 应用程序开发区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章