Directory-Structure

lib、lib32、lib64、libx32 和 libexec 之間的區別

  • May 5, 2013

我的 64 位 Ubuntu 13.04 系統有以下目錄/

lib
lib32
lib64
libx32
libexec

目錄中/usr有:

lib
lib32
libx32
libexec

這似乎可以通過搜尋輕鬆回答,但我在網上一無所獲,除了這些目錄儲存共享庫(libexec 除外)。但是哪些共享庫位於哪些文件夾中(除了 lib32 中的 32 位和 lib64 中的 64 位)?有人可以解釋所有這些目錄之間的區別嗎?

啊,是的,如果您處理 Unix 很長時間,這將是一個非常令人困惑的部分。大多數 Unix 系統“嘗試”遵循的標準稱為FHS - 文件系統層次結構標準

鑑於我主要使用基於 Red Hat 的發行版,我最熟悉他們對 Fedora、CentOS 和 RHEL Linux 發行版的 FHS 的看法。但是我也使用過基於 Debian 和 BSD 的發行版,它們在保存位置和文件系統方面並沒有太大的不同。

現在回答你的問題。我會看一下FHS 文件,它鬆散地管理著這些目錄結構。一般來說:

目錄 -/lib

包含基本的共享庫和核心模組。

用途: /lib 目錄包含啟動系統和執行根文件系統中的命令所需的那些共享庫映像,即。通過 /bin 和 /sbin 中的二進製文件。

**注意 1:**只有 /usr 中的二進製文件(例如任何 X Window 二進製文件)才需要的共享庫不得位於 /lib 中。只有在 /bin 和 /sbin 中執行二進製文件所需的共享庫可能在這裡。

**注意2:**鑑於 /lib 的主要目的是包含部署到目錄 /bin 和 /sbin 的工具的庫,/lib 中的庫可以是 32 位或 64 位。

例如(Fedora 14 64 位系統)

$ uname -a
Linux grinchy 2.6.35.14-106.fc14.x86_64 #1 SMP Wed Nov 23 13:07:52 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux

這是我的 /lib 中的文件樣本

./libpam.so.0.82.2:             ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, stripped
./libplc4.so:                   ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, stripped
./libidn.so.11.6.1:             ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, stripped
./upstart/telinit:              ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, stripped
./upstart/runlevel:             ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, stripped
./upstart/shutdown:             ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, stripped
./upstart/reboot:               ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, stripped
./libdb-4.8.so:                 ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, stripped
./firmware/mixart/miXart8.elf:  ELF 32-bit MSB executable, PowerPC or cisco 4500, version 1 (SYSV), statically linked, not stripped
./libtinfo.so.5.7:              ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, stripped

目錄 -/lib<qual>

備用格式基本共享庫(可選)。這些將是目錄 /lib32、/lib64 等。

**目的:**在支持多於一種二進制格式的系統上可能有一個或多個 /lib 目錄變體,需要單獨的庫。這通常用於支持多種二進制格式但需要同名庫的系統上的 64 位或 32 位支持。

**注意:**在這種情況下,/lib32 和 /lib64 可能是庫目錄,而 /lib 是其中之一的符號連結。

目錄 -/usr/lib

用於程式和包的庫。

用途: /usr/lib 包括不打算由使用者或 shell 腳本直接執行的目標文件、庫和內部二進製文件。

**注意 1:**其他與體系結構無關的特定於應用程序的靜態文件和子目錄必須放在 /usr/share 中。

應用程序可以使用 /usr/lib 下的單個子目錄。如果應用程序使用子目錄,則該應用程序專門使用的所有與體系結構相關的數據都必須放在該子目錄中。

**注意2:**例如,Perl 5 模組和庫的 perl5 子目錄。

目錄 -/usr/lib<qual>

備用格式庫(可選)。

目的: /usr/lib<qual>作為替代二進制格式的 /usr/lib 執行相同的角色,除了符號連結/usr/lib<qual>/sendmail/usr/lib<qual>/X11不是必需的。

**注意:**如果/usr/lib 和/usr/lib/usr/lib<qual>相同(一個是指向另一個的符號連結),這些文件和每個應用程序的子目錄將存在。

TLDR;

一般來說:

如果 /bin 或 /sbin 目錄中有執行檔所需的庫,則這些庫應位於 /lib* 目錄中。

如果有用於使用程序和包的庫,則它們位於 /usr/lib/* 中。如果有特定庫需要的執行檔,但這些執行檔不應該由使用者直接或由 root 呼叫,它們會進入 /usr/libexec。

引用自:https://unix.stackexchange.com/questions/74646