使用strace
我发现了ldconfig
(glibc)的行为,我无法理解
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
)
您的库可能在某个时间被错误地重命名为 from
/usr/lib/libselinux.1
到/usr/lib/libext2fs.so.2
。这不会阻止ldconfig从库的内容(而不是库的文件名)中找到预期的名称,从而链接“正确”的名称。这可以通过将任何库复制到某个目录并要求ldconfig更新(仅)该目录来验证。这是 Debian 9 上的等价物:
顺便说一句,libselinux是处理 SELinux的软件的通用库。甚至
ls
,cp
,mv
,ps
命令通常也与它链接(对于它们各自的-Z
选项)。