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


41

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

lib
lib32
lib64
libx32
libexec

/usr目录中有:

lib
lib32
libx32
libexec

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


BSD,Fedora,AIX和Solaris在目录结构方面各有千秋。

Answers:


39

嗯,如果您已经处理了Unix一段时间,这是一个非常令人困惑的部分。大多数Unixes都遵循一种称为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

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

TLDR;

一般来说:

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

如果有使用程序和程序包的库,则它们位于/ usr / lib / *中。如果特定库需要某些可执行文件,但是这些可执行文件不是由用户直接调用或由root调用的,则它们位于/ usr / libexec中。


谢谢。您能澄清一下,何时将32位或64位的库放置到lib中,而不是将其对应的lib <qual>文件夹放置到lib中吗?我不太明白你的解释。
gsingh2011 2013年

/ lib的主要目的是包含/ bin和/ sbin中的工具库。鉴于/ lib可以同时包含32位和64位库。我也会将此评论添加到答案中!
slm

也许将TLDR部分放在顶部?
kevinarpe 2015年

1
lib32和libx32有什么区别?
Mikko Rantalainen

2
libx32用于x32。您可以将该file实用程序与这些目录中的库一起使用,以查看区别。
elmicha '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.