используя 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
)
решение1
Ваша библиотека, вероятно, была переименована по ошибке в какой-то момент с /usr/lib/libselinux.1
на /usr/lib/libext2fs.so.2
. Это не мешаетldconfigчтобы найти ожидаемое имя из содержимого библиотеки (а не имя файла библиотеки) и таким образом связать "правильное" имя. Это можно проверить, скопировав любую библиотеку в какой-нибудь каталог и спросивldconfigдля обновления (только) этого каталога.
Вот эквивалент в 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
опции).