[Linux]动态链接库静态替换
2015-09-23 23:07
459 查看
Linux平台动态链接库(Shared Object,SO)替换可以分为静态替换和动态替换:静态替换利用文件操作直接替换SO,新SO在下次加载时生效;动态替换利用代码注入申请并修改目标进程内存空间,实现新SO的加载和替换,新SO立即生效。
对于未被加载的原SO,利用复制命令(cp new.so old.so)即可直接完成静态替换,新SO在下次加载时生效。对于已经加载的原SO,直接用新SO复制替换将会导致相应程序崩溃,此种情况可以使用删除原SO(rm -f old.so)或修改原SO名称(mv old.so oldx.so)后,再复制新SO的方法代替,新SO同样在下次加载时生效。
出现这种情况的原因是复制替换操作会破坏系统访问原SO的索引节点inode,导致系统找不到原SO。
系统为每个加载到内存中的文件创建对应的inode,用来管理该文件,inode包含了文件的元信息,如文件字节数、拥有者ID、读写执行权限等。系统以inode标识程序加载的SO,不再关心文件名,修改SO名称并未改变对应inode,因此程序可以继续正常运行;删除SO只是无法查看,系统直到程序释放SO后才真正删除SO和inode,因此程序也可以继续正常运行;但是在直接复制替换时,新SO将会继承原SO的inode,程序无法继续访问原SO,从而导致程序崩溃。
【参考】
http://www.linuxidc.com/Linux/2011-01/31622.htm
http://www.cnblogs.com/itech/archive/2012/05/15/2502284.html
对于未被加载的原SO,利用复制命令(cp new.so old.so)即可直接完成静态替换,新SO在下次加载时生效。对于已经加载的原SO,直接用新SO复制替换将会导致相应程序崩溃,此种情况可以使用删除原SO(rm -f old.so)或修改原SO名称(mv old.so oldx.so)后,再复制新SO的方法代替,新SO同样在下次加载时生效。
出现这种情况的原因是复制替换操作会破坏系统访问原SO的索引节点inode,导致系统找不到原SO。
系统为每个加载到内存中的文件创建对应的inode,用来管理该文件,inode包含了文件的元信息,如文件字节数、拥有者ID、读写执行权限等。系统以inode标识程序加载的SO,不再关心文件名,修改SO名称并未改变对应inode,因此程序可以继续正常运行;删除SO只是无法查看,系统直到程序释放SO后才真正删除SO和inode,因此程序也可以继续正常运行;但是在直接复制替换时,新SO将会继承原SO的inode,程序无法继续访问原SO,从而导致程序崩溃。
【参考】
http://www.linuxidc.com/Linux/2011-01/31622.htm
http://www.cnblogs.com/itech/archive/2012/05/15/2502284.html
相关文章推荐
- Linux下rz,sz与ssh,SecureCRT的配合使用
- 1、一些简单的命令.md
- Linux下安装Java抓包库JPcap
- Linux复习笔记(四) -- Linux常用命令
- 150923-碎觉要-PHP,Linux
- Linux:文件解压与压缩
- Linux复习笔记(二) -- Linux文件系统基本结构和操作
- centos 文档的压缩和打包 gzip,bzip2,xz,zip,unzip,tar 第九节课
- 必 备 习 题 集 (一)
- linux下C++ gdb调试笔记
- linux(ftp)
- Linux DRM KMS 驱动简介
- 云计算大赛准备过程之安装虚拟机及linux系统ubuntu过程
- linux(知识)
- no ocijdbc11 in java.library.path linux
- linux中断原理专题
- Linux使用笔记: 定制core dump文件的文件名
- Install R and RStudio on Ubuntu
- linux面试题
- Linux下面的终端编程 做一个简单的菜单