修改libc.so.6导致崩溃解决

root@u0-100:~# ll /lib/x86_64-linux-gnu/libc-*
-rwxr-xr-x 1 root root 2030544 Jun  5  2020 /lib/x86_64-linux-gnu/libc-2.27.so*
-rwxr-xr-x 1 root root 2029224 Oct 14 16:00 /lib/x86_64-linux-gnu/libc-2.31.so*
root@u0-100:~#
root@u0-100:~#
root@u0-100:~# ll /lib/x86_64-linux-gnu/libc.so.6
lrwxrwxrwx 1 root root 34 Oct 14 16:31 /lib/x86_64-linux-gnu/libc.so.6 -> /lib/x86_64-linux-gnu/libc-2.27.so*
root@u0-100:~#

/lib/x86_64-linux-gnu/libc.so.6libc.so.6是一个软连接。不能轻易修改这个文件。
(1)比如直接复制同名文件libc.so.6到/lib/x86_64-linux-gnu/libc.so.6,系统会立刻hang住,网络断开,无法连接,无法操作。只能重启机器。这是危险操作。
(2)再比如:强制重新连接:ln -s -f libc-2.31.so /lib/x86_64-linux-gnu/libc.so.6
这个命令危险,不能操作。操作完后,基本所有命令都不能使用了:

root@u0-100:/# ls
ls: relocation error: /lib/x86_64-linux-gnu/libpthread.so.0: symbol __libc_vfork version GLIBC_PRIVATE not defined in file libc.so.6 with link time reference
root@u0-100:/#
root@u0-100:/#

如果真的执行了上述操作,可以使用下面方法挽回:

root@u0-100:/# LD_PRELOAD=/lib/x86_64-linux-gnu/libc-2.27.so ln -s -f /lib/x86_64-linux-gnu/libc-2.27.so /lib/x86_64-linux-gnu/libc.so.6
root@u0-100:/#
root@u0-100:/# ls
bin   cdrom  etc   initrd.img      lib    media  opt   root  sbin  srv       sys  usr  vmlinuz
boot  dev    home  initrd.img.old  lib64  mnt    proc  run   snap  swap.img  tmp  var  vmlinuz.old

文件路径以及名称要换成你修改的位置。
linux调用so库文件时,先搜索当前路径,提供LD_PRELOAD系统变量可以改变这个顺序,改变后的搜索顺序为 LD_PRELOAD, 当前路径, 系统库目录。
于是,使用LD_PRELOAD指向正常的glibc库文件,然后执行ln等命令,就可以正常执行,执行成功之后, libc.so.6 就又存在了。

以上环境是ubuntu操作系统。centos应该也适用。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。

推荐阅读更多精彩内容