Gluttton Asked: 2018-06-03 11:43:33 +0800 CST2018-06-03 11:43:33 +0800 CST 2018-06-03 11:43:33 +0800 CST 为什么有 `/lib` 和 `/lib64` 而只有 `/bin`? 772 在我的笔记本电脑中: $ cat /etc/issue Ubuntu 18.04 LTS \n \l x86库和有两个不同的文件夹x86_64: ~$ ls -1 / bin lib lib64 sbin ... 为什么二进制文件只存在一个目录? PS我也对Android感兴趣,但我希望答案应该是一样的。 linux android 2 个回答 Voted Best Answer Arkadiusz Drabczyk 2018-06-03T12:29:53+08:002018-06-03T12:29:53+08:00 首先,为什么会有单独的/liband /lib64: 文件系统层次标准 提到分离和/lib存在/lib64是因为: 10.1。在支持多于一种需要单独库的二进制格式的系统上,/lib 目录可能有一个或多个变体。(...) 这通常用于支持多种二进制格式但需要同名库的系统上的 64 位或 32 位支持。在这种情况下,/lib32 和 /lib64 可能是库目录,而 /lib 是其中之一的符号链接。 例如,在我的 Slackware 14.2 上,分别有32 位/lib和/lib64 64 位库的目录,尽管 /lib它不像 FHS 片段所暗示的那样是符号链接: $ ls -l /lib/libc.so.6 lrwxrwxrwx 1 root root 12 Aug 11 2016 /lib/libc.so.6 -> libc-2.23.so $ ls -l /lib64/libc.so.6 lrwxrwxrwx 1 root root 12 Aug 11 2016 /lib64/libc.so.6 -> libc-2.23.so 和中有两个libc.so.6库。/lib/lib64 每个动态构建 的ELF 二进制文件都 包含一个通向解释器的硬编码路径,在本例中为 /lib/ld-linux.so.2或/lib64/ld-linux-x86-64.so.2: $ file main main: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, not stripped $ readelf -a main | grep 'Requesting program interpreter' [Requesting program interpreter: /lib/ld-linux.so.2] $ file ./main64 ./main64: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, not stripped $ readelf -a main64 | grep 'Requesting program interpreter' [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2] 解释器的工作是加载必要的共享库。您可以询问 GNU 解释器它会加载哪些库,甚至无需使用LD_TRACE_LOADED_OBJECTS=1或ldd包装器运行二进制文件: $ LD_TRACE_LOADED_OBJECTS=1 ./main linux-gate.so.1 (0xf77a9000) libc.so.6 => /lib/libc.so.6 (0xf760e000) /lib/ld-linux.so.2 (0xf77aa000) $ LD_TRACE_LOADED_OBJECTS=1 ./main64 linux-vdso.so.1 (0x00007ffd535b3000) libc.so.6 => /lib64/libc.so.6 (0x00007f56830b3000) /lib64/ld-linux-x86-64.so.2 (0x00007f568347c000) 正如您所看到的,给定的解释器确切地知道在哪里寻找库 - 32 位版本/lib在/lib64. FHS 标准对以下内容进行了说明/bin: /bin 包含系统管理员和用户都可以使用的命令,但是当没有安装其他文件系统时(例如在单用户模式下)需要这些命令。它还可能包含脚本间接使用的命令。 /binIMO 没有单独的原因/bin64是,如果我们在这两个目录中都有同名的文件,我们不能间接调用其中一个,因为我们必须将/binor/bin64首先放入 $PATH. 但是,请注意,以上只是约定——Linux 内核并不真正关心您是否有单独的/bin和/bin64. 如果您需要它们,您可以创建它们并相应地设置您的系统。 您还提到了 Android - 请注意,除了运行修改后的 Linux 内核之外,它与 Ubuntu 等 GNU 系统无关 - 没有 glibc,没有 bash(默认情况下,您当然可以手动编译和部署它),以及目录结构完全不同。 Thomas Dickey 2018-06-03T12:21:18+08:002018-06-03T12:21:18+08:00 原因是 lib/lib64 目录可以包含碰巧具有相同名称的文件,因为这些是与不同程序共享的库。将它们放在单独的目录中可以解决冲突。(通常......)没有充分的理由在同一系统上分发 32/64 位的同名可执行文件,但由于可以混合可执行文件,因此必须提供共享库。
首先,为什么会有单独的
/lib
and/lib64
:文件系统层次标准 提到分离和
/lib
存在/lib64
是因为:例如,在我的 Slackware 14.2 上,分别有32 位
/lib
和/lib64
64 位库的目录,尽管/lib
它不像 FHS 片段所暗示的那样是符号链接:和中有两个
libc.so.6
库。/lib
/lib64
每个动态构建 的ELF 二进制文件都 包含一个通向解释器的硬编码路径,在本例中为
/lib/ld-linux.so.2
或/lib64/ld-linux-x86-64.so.2
:解释器的工作是加载必要的共享库。您可以询问 GNU 解释器它会加载哪些库,甚至无需使用
LD_TRACE_LOADED_OBJECTS=1
或ldd
包装器运行二进制文件:正如您所看到的,给定的解释器确切地知道在哪里寻找库 - 32 位版本
/lib
在/lib64
.FHS 标准对以下内容进行了说明
/bin
:/bin
IMO 没有单独的原因/bin64
是,如果我们在这两个目录中都有同名的文件,我们不能间接调用其中一个,因为我们必须将/bin
or/bin64
首先放入$PATH
.但是,请注意,以上只是约定——Linux 内核并不真正关心您是否有单独的
/bin
和/bin64
. 如果您需要它们,您可以创建它们并相应地设置您的系统。您还提到了 Android - 请注意,除了运行修改后的 Linux 内核之外,它与 Ubuntu 等 GNU 系统无关 - 没有 glibc,没有 bash(默认情况下,您当然可以手动编译和部署它),以及目录结构完全不同。
原因是 lib/lib64 目录可以包含碰巧具有相同名称的文件,因为这些是与不同程序共享的库。将它们放在单独的目录中可以解决冲突。(通常......)没有充分的理由在同一系统上分发 32/64 位的同名可执行文件,但由于可以混合可执行文件,因此必须提供共享库。