如何替换Linux共享库

如何替换Linux共享库,第1张

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

动态替换

针对已经被程序加载的SO,为了实现不停止程序,替换后的SO立即生效的目的,可以采用动态替换。

动态替换的对象既可以是SO整体,也可以是SO中的特定函数。两者的区别主要是整体替换需要在特定函数替换的基础上再增加SO加载及输出函数重定位等过程。由于时间有限, 本文仅介绍特定函数动态替换的基本原理和初步实现,SO整体替换感兴趣的 读者可以自行尝试。

SO特定函数动态替换主要包括三个关键过程:控制目标进程,构造替换内容和确定替换地址,实际上依次解决的就是利用什么替换、替换什么内容和替换到哪里的问题。

原因一般有两个, 一个是 *** 作系统里确实没有包含该共享库(lib*.so.*文件)或者共享库版本不对, 遇到这种情况那就去网上下载并安装上即可.

另外一个原因就是已经安装了该共享库, 但执行需要调用该共享库的程序的时候, 程序按照默认共享库路径找不到该共享库文件.

# cat /etc/ld.so.conf

include ld.so.conf.d/*.conf

# echo "/usr/local/lib" >>/etc/ld.so.conf

# ldconfig

1.什么是Linux?

Linux是 *** 作系统Unix的克隆,由Linus Torvalds在一个自由松散的网络黑客团队的协助下从头开始编写。它的目标是符合POSIX和单一UNIX规范。它具有现代成熟Unix中所期望的所有功能,包括真正的多任务处理、虚拟内存、共享库、按需加载、共享的写时拷贝可执行文件、适当的内存管理以及包括IPv4和IPv6在内的多级网络。虽然Linux最初是为基于32位x86的PC(386或更高版本)开发的,但今天它也运行在多种其他处理器体系结构上,包括32位和64位变体。

2.Linux发行版本

如果你是Linux新手,您不想下载内核,它只是Linux系统中的一个组件。相反,你需要的是所谓的Linux发行版,它是一个完整的Linux系统。有许多发行版可在互联网上下载,也可从不同的供应商处购买;有些是通用的,有些是针对特定用途而优化的。目前有几种Linux发行版的镜像,可在这里下载

目前内核版本 Latest Release 5.15,下载地址:

比较常用的linux系统发行版有:

Linux Mint

open SUSE

以ubuntu为例:

查看系统版本信息

root@user-virtual-machine:/home# uname -a

Linux user-virtual-machine 4.4.0-210-generic #242-Ubuntu SMP Fri Apr 16 09:57:56 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

查看内核版本信息

root@user-virtual-machine:/home# uname -r

4.4.0-210-generic


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8714844.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-20
下一篇 2023-04-20

发表评论

登录后才能评论

评论列表(0条)

保存