如何在不使用ln的情况下创建符号链接?

Seb*_*bas 31 linux symbolic-link centos6

我删除了一个关键的符号链接 - libc.so.6。我有它应该指向的文件,但是由于缺少链接,诸如ln或之类的基本命令wget将不再起作用。但是,echo或其他 Bash 内置函数可以工作。

我正在寻找一种方法来重新创建此符号链接。

nat*_*njo 58

您可以使用 ldconfig,它会重新创建符号链接:

# rm /lib/libc.so.6 
rm: remove symbolic link `/lib/libc.so.6'? y
# ls -l /lib/libc*
ls: error while loading shared libraries: libc.so.6: cannot open shared object file:
# ldconfig 
# ls -l /lib/libc*
[skip]
lrwxrwxrwx. 1 root root      12 May 11 07:59 /lib/libc.so.6 -> libc-2.12.so
Run Code Online (Sandbox Code Playgroud)

如您所见,刚刚对其进行了测试。

  • 这不仅仅是“方便”,静态链接的二进制文件几乎是维护动态库的工具的必要设计组件!但这正是它成为解决此问题的理想工具的原因,恕我直言,这是唯一“正确”的方法。这里的问题实际上与已删除的符号链接无关(其中 99.999% 可以删除而不会产生任何后果),而是“我破坏了系统的动态库存储”。提出@natxo 的建议,“使用管理该商店的工具修复它”,显而易见且明智。其他任何东西(手动重新创建链接)都是一种笨拙的解决方法。 (16认同)
  • 而且,方便的是,/sbin/ldconfig 是静态链接的。ldconfig 首先负责那些符号链接。 (4认同)

Mar*_*ick 44

CentOS 6 通常带有busybox一组静态链接的 Unix 工具,安装在/sbin. 你可以像这样运行它:

/sbin/busybox ln -s libc-2.12.so /lib/libc.so.6
Run Code Online (Sandbox Code Playgroud)


Den*_*ker 23

设置 LD_PRELOAD 以预加载相关库。我用 libpthread 试了一下,它似乎有效:

root@spirit:~# mv /lib/x86_64-linux-gnu/libpthread.so.0 /lib/x86_64-linux-gnu/libpthread.so.0-bak
root@spirit:~# chattr
chattr: error while loading shared libraries: libpthread.so.0: cannot open shared object file: No such file or directory
root@spirit:~# LD_PRELOAD=/lib/x86_64-linux-gnu/libpthread.so.0-bak chattr
Usage: chattr [-RVf] [-+=AaCcDdeijsSu] [-v version] files...
Run Code Online (Sandbox Code Playgroud)


小智 23

sln正是为了这个目的:当你不能使用常规 ln 时修复符号链接,因为你破坏了一个基本的符号链接。引用其手册页:

描述

  The  sln  program creates symbolic links.  Unlike the ln(1) program, it
  is statically linked.  This means that if for some reason  the  dynamic
  linker  is  not  working,  sln  can  be  used to make symbolic links to
  dynamic libraries.
Run Code Online (Sandbox Code Playgroud)


pho*_*ops 8

您可以设置LD_LIBRARY_PATH变量以包含 real 所在的目录libc.so.6

 export LD_LIBRARY_PATH="/dir/for/libc.so.6/:$LD_LIBRARY_PATH"
Run Code Online (Sandbox Code Playgroud)

此外,执行ldconfig它以重新创建链接。这应该使命令起作用,以便您可以使用ln命令来修复您的系统。

另一种方法是通过 LiveCD 启动并在那里链接文件。

  • 这不起作用,因为链接到的文件未命名为 libc.so.6。您需要按照我的回答设置 LD_PRELOAD。 (2认同)