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应该也适用。