使用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
所以我的问题具体是:
- 这个libselinux.so.1在这里的作用是什么
- 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。甚至ls
、cp
、mv
、ps
命令通常也与它链接(对于它们各自的-Z
选项)。