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,从而导致程序崩溃。