Glu*_*ton 28 linux android architecture
在我的笔记本电脑中:
$ cat /etc/issue
Ubuntu 18.04 LTS \n \l
Run Code Online (Sandbox Code Playgroud)
库x86和有两个不同的文件夹x86_64:
~$ ls -1 /
bin
lib
lib64
sbin
...
Run Code Online (Sandbox Code Playgroud)
为什么二进制文件只存在一个目录?
PS 我也对 Android 感兴趣,但我希望答案应该是一样的。
Ark*_*zyk 26
首先,为什么有单独的/lib和/lib64:
该文件系统层次标准
中提到,独立/lib和/lib64存在是因为:
10.1. 在支持一种以上需要单独库的二进制格式的系统上,/lib 目录可能有一个或多个变体。(...) 这通常用于支持多种二进制格式但需要同名库的系统上的 64 位或 32 位支持。在这种情况下, /lib32 和 /lib64 可能是库目录,而 /lib 是其中之一的符号链接。
例如,在我的 Slackware 14.2 上,分别有
32 位和 64 位库的/lib和/lib64目录,即使
/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
Run Code Online (Sandbox Code Playgroud)
有两个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]
Run Code Online (Sandbox Code Playgroud)
解释器的工作是加载必要的共享库。您可以询问 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)
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,给定的解释器确切地知道在哪里查找库 - 32 位版本/lib在/lib64.
FHS 标准对以下内容进行了说明/bin:
/bin 包含系统管理员和用户都可以使用的命令,但是当没有安装其他文件系统时(例如在单用户模式下),这些命令是必需的。它还可能包含脚本间接使用的命令。
IMO为什么没有单独的原因/bin,并/bin64是,如果我们有文件在这两个目录的名称相同,我们不能给他们打电话的一个间接原因,我们不得不把/bin或/bin64在第一
$PATH。
但是,请注意,以上只是约定俗成的 - Linux 内核并不真正关心您是否有单独的/bin和/bin64. 如果您需要它们,您可以创建它们并相应地设置您的系统。
您还提到了 Android - 请注意,除了运行修改后的 Linux 内核之外,它与 Ubuntu 等 GNU 系统无关 - 没有 glibc,没有 bash(默认情况下,您当然可以手动编译和部署它),以及目录结构是完全不同的。
Tho*_*key 23
原因是 lib/lib64 目录可以包含碰巧具有相同名称的文件,因为这些是与不同程序共享的库。将它们放在单独的目录中可以解决冲突。(通常……)在同一系统上分发 32/64 位的同名可执行文件没有充分的理由,但由于可能存在可执行文件的混合,因此必须提供共享库。
| 归档时间: |
|
| 查看次数: |
5373 次 |
| 最近记录: |