为什么 ldconfig 会创建从 libext2fs.so.2 到 libselinux.so.1 的符号链接?

为什么 ldconfig 会创建从 libext2fs.so.2 到 libselinux.so.1 的符号链接?

使用strace我发现了(glibc)的行为ldconfig,我无法理解

lstat("/usr/lib/libext2fs.so.2", {st_mode=S_IFLNK|0777, st_size=16, ...}) = 0
unlink("/usr/lib/libext2fs.so.2")       = 0
symlink("libselinux.so.1", "/usr/lib/libext2fs.so.2") = 0

是否需要ext2fs( libext2fs.so.2) 的共享对象库成为libselinux.so.1.

ldconfig 如何知道要做什么?在我看来,这个静态二进制文件/usr/bin/ldconfig对这种行为进行硬编码似乎不合逻辑,对吧。然而它的配置文件/etc/ld.so.conf并不能帮助我解开这个谜团。

是什么让这一切与我的发行版工具(Arch Linux)更加令人困惑/可疑,我找不到该文件所属的任何包。

$ pkgfile /usr/lib/libselinux.so.1

不显示任何包,而 $ pkgfile /usr/lib/libext2fs.so

输出core/e2fsprogs

所以我的问题具体是:

  1. 这个libselinux.so.1在这里的作用是什么
  2. ldconfig 如何决定创建该符号链接(顺便说一句。中断e2fsck

答案1

您的库可能在某个时候被错误地重命名为/usr/lib/libselinux.1/usr/lib/libext2fs.so.2。这并不能阻止LD配置从库的内容(而不是库的文件名)中找到预期的名称,从而链接“正确”的名称。这可以通过将任何库复制到某个目录并询问来验证LD配置(仅)更新此目录。

Debian 9 上的等效项:

$ mkdir /tmp/foo
$ cp -aL /lib/x86_64-linux-gnu/libselinux.so.1 /tmp/foo/libmytest.so.2
$ ls -l /tmp/foo/*
-rw-r--r-- 1 test test 155400 Sep 24  2017 /tmp/foo/libmytest.so.2
$ /sbin/ldconfig -v -n /tmp/foo
/tmp/foo:
    libselinux.so.1 -> libmytest.so.2 (changed)
$ ls -l /tmp/foo/*
-rw-r--r-- 1 test test 155400 Sep 24  2017 /tmp/foo/libmytest.so.2
lrwxrwxrwx 1 test test     14 Jun  5 23:33 /tmp/foo/libselinux.so.1 -> libmytest.so.2

顺便一提libselinux是处理软件的通用库 SELinux。甚至lscpmvps命令通常也与它链接(对于它们各自的-Z选项)。

相关内容