使用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
選項)。