写在前面
上层语言的好处就是方便,但无法触摸规则的底层,所有的规则都是别人制定的
学习底层原理不仅可以让我们对高级语言的规则有更深的理解,而且可以从自己的角度去探寻新的道路
背景
有些时候我们可能想替换环境上的c库,但是如果不慎直接把原有的c库给mv掉了,或者替换的c库不能用,这时候就傻眼了,可执行文件全部不可用,怎么恢复环境呢?
就目前来说,我没有看到其他文章有给出对于动态链接器和C库损坏的的解决方案
另一种方案请参考我的另一篇文章:基于剪贴板的文件传输方案
原理
动态链接器
上图是aarch64平台的动态链接器,x86平台的叫/usr/lib64/ld-xx.so
这个库被破坏会导致所有依赖动态库的可执行文件均不可用
C库
这个库被破坏了啥玩意都够够呛能用了,怎么说呢,,,那可是C库啊,
汇编代码
.data
srcfile:.string "/usr/lib/aarch64-linux-gnu/libc.so.6_bak"
dstfile:.string "/usr/lib/aarch64-linux-gnu/libc.so.6"
.text
.global _start
_start:
ldr x0, =srcfile
ldr x2, =dstfile
mov x8, 36 // the call number of symlink
svc #0
mov x8, 93
svc #0
一段很简单的汇编代码,使用symlinkat系统调用从备份的文件建立了一个软链接,不了解汇编的话可以参考这两篇文章
x86平台AT&T语法:AT&T汇编入门[0] hello world
ARM64平台:ARM64汇编[0] hello world
x86平台上有symlink可以使用,aarch64平台上需要使用多一个参数的symlinkat ↓
示例
删除C库
可以看到删完C库之后ls立即不可用了,在左边运行实现编译好的汇编程序,从备份文件建立一个软链接,环境恢复正常
删除动态链接器
可以看到删完动态链接器之后ls又不可用了,在左边运行实现编译好的汇编程序,从备份文件建立一个软链接,环境恢复正常