Strace
為什麼 ldconfig 會從 libext2fs.so.2 創建到 libselinux.so.1 的符號連結?
使用
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 上的等價物:
$ 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
選項)。