為什麼 ldconfig 會建立從 libext2fs.so.2 到 libselinux.so.1 的符號連結?

為什麼 ldconfig 會建立從 libext2fs.so.2 到 libselinux.so.1 的符號連結?

使用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

所以我的問題具體是:

  1. 這個libselinux.so.1在這裡的作用是什麼
  2. 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。甚至lscpmvps命令通常也與它連結(對於它們各自的-Z選項)。

相關內容