Почему существуют `/lib` и` /lib64`, но только `/bin`?

В моем ноутбуке:

$ cat /etc/issue  
Ubuntu 18.04 LTS \n \l

Существуют две разные папки для библиотек: x86 и x86_64:

~$ ls -1 /  
bin
lib
lib64
sbin
...

Почему для двоичных файлов существует только один каталог?

P.S. Я также заинтересован в Android, но я надеюсь, что ответ должен быть таким же.

27 голосов | спросил Gluttton 2 J0000006Europe/Moscow 2018, 22:43:33

2 ответа


25

Во-первых, почему существуют отдельные /lib и /lib64:

Стандарт иерархии файловой системы что отдельный /lib и /lib64 существует, потому что

  

10,1. Может существовать один или несколько вариантов каталога /lib в системах, которые поддерживают более одного двоичного формата, требующего   отдельные библиотеки. (...) Это обычно используется для 64-разрядных или 32-разрядных   поддержка систем, поддерживающих несколько двоичных форматов, но требующих   одноименные библиотеки. В этом случае /lib32 и /lib64 могут быть   каталоги библиотек и /lib символическую ссылку на одну из них.

На моем Slackware 14.2, например, есть /lib и /lib64 каталогов для 32-разрядных и 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 binary содержит жесткий путь к интерпретатору, в этом случае либо /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 и 64-битные версия ищет библиотеки в /lib64.

В стандарте FHS говорится следующее о /bin:

  

/bin содержит команды, которые могут использоваться как системой   администратором и пользователями, но которые необходимы, когда нет других   файловые системы монтируются (например, в однопользовательском режиме). Он также может   содержат команды, которые косвенно используются скриптами.

ИМО - причина, по которой нет отдельного /bin и /bin64 заключается в том, что если бы мы файл с тем же именем в обоих этих каталогах мы не могли назвать одним из них косвенно, потому что нам пришлось бы поставить /bin или /bin64 сначала в $PATH

Однако обратите внимание, что выше всего просто соглашение - Linux ядро все равно, если у вас есть отдельный /bin и /bin64. Если вы хотите их, вы можете создать их и настроить свою систему соответственно.

Вы также упомянули Android - обратите внимание, что, за исключением запуска измененного Ядро Linux не имеет ничего общего с системами GNU, такими как Ubuntu - нет glibc, no bash (по умолчанию вы можете, конечно, скомпилировать и развернуть его вручную), а также структура каталогов совершенно разные.

ответил Arkadiusz Drabczyk 2 J0000006Europe/Moscow 2018, 23:29:53
22

Причина в том, что каталоги lib /lib64 могут содержать файлы, которые имеют одно и то же имя , потому что это библиотеки, совместно используемые с различными программами. Помещение их в отдельные каталоги разрешает конфликт. Там (обычно ...) нет веских оснований для распространения одноименных исполняемых файлов в одной и той же системе, которые 32/64-битные, но поскольку может быть смесь исполняемых файлов, необходимо предоставить общие библиотеки.

ответил Thomas Dickey 2 J0000006Europe/Moscow 2018, 23:21:18

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132