lib、lib32、lib64、libx32 和 libexec 之间的区别

gsi*_*011 46 libraries directory-structure

我的 64 位 Ubuntu 13.04 系统在以下目录中有以下目录/

lib
lib32
lib64
libx32
libexec
Run Code Online (Sandbox Code Playgroud)

/usr目录中有:

lib
lib32
libx32
libexec
Run Code Online (Sandbox Code Playgroud)

这似乎可以通过搜索轻松回答,但我在网上找不到任何东西,除了这些目录存储共享库(libexec 除外)。但是哪些共享库放在哪些文件夹中(除了 lib32 中的 32 位和 lib64 中的 64 位)?有人可以解释所有这些目录之间的区别吗?

slm*_*slm 45

啊,是的,如果您已经与 Unix 打过交道,那么这是一个非常令人困惑的部分。大多数 Unix 都“尝试”遵循一个标准,称为FHS - Filesystem Hierarchy Standard

鉴于我主要使用基于 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
Run Code Online (Sandbox Code Playgroud)

这是我的 /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
Run Code Online (Sandbox Code Playgroud)

目录 - /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<qual>相同(一个是到另一个的符号链接),这些文件和每个应用程序的子目录将存在。

TLDR;

一般来说:

如果 /bin 或 /sbin 目录中存在可执行文件所需的库,则这些库应位于 /lib* 目录中。

如果有用于使用程序和包的库,它们会放在 /usr/lib/* 中。如果有特定库需要的可执行文件,但这些可执行文件不应该被用户直接调用或由 root 调用,它们会进入 /usr/libexec。

  • libx32 用于 [x32](https://en.wikipedia.org/wiki/X32_ABI)。您可以将 `file` 实用程序与这些目录中的库一起使用以查看差异。 (2认同)