Чому існують `/ lib` і` / lib64`, але лише `/ bin`?


27

У моєму ноутбуці:

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

Є дві різні папки для бібліотек x86і x86_64:

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

Чому для бінарних файлів існує лише одна директорія?

PS Мене також цікавить Android, але сподіваюся, що відповідь має бути однаковою.


1
Тільки в одному? Я бачу і те, /binі /sbinтам. Яке питання? Ви питаєте про різницю між /libта /lib64?
Кусалаланда

2
@Kusalananda, я маю на увазі, що не існує незалежної папки для x86_64(ні для, /binні для /sbin).
Gluttton

7
ОП ІМО хоче знати, чого немає /bin64.
Аркадіуш Драбчик

Приблизно одна програма, яка отримує перевагу від 32-розрядної та 64-бітної версій (WINE), обходить її, маючи бінарні файли ( wine*32і wine*64) з різними назвами .
Ігнасіо Васкес-Абрамс

1
@ IgnacioVazquez-Abrams: також потрібно сказати, що ви пов'язуєте бінарні файли проти бібліотек, а не навпаки. Таким чином, бінарні файли не потрібно розділяти на 32/64-розрядність.
smci

Відповіді:


25

По-перше, чому існують окремі /libта /lib64:

Filesystem Hierarchy Standard зазначає , що окремі /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 містить твердо кодований шлях до інтерпретатора, у цьому випадку /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 містить команди, які можуть використовуватися як адміністратором системи, так і користувачами, але які необхідні, коли не встановлено жодної іншої файлової системи (наприклад, в режимі одного користувача). Він також може містити команди, які опосередковано використовуються скриптами.

IMO причина, чому немає окремих, /binі в /bin64тому, що якби у нас був файл з однаковим іменем в обох цих каталогах, ми не могли б викликати один з них опосередковано, тому що нам би довелося вводити /binабо /bin64спочатку вводити $PATH.

Однак зауважте, що вищезазначене - лише умова - ядро ​​Linux не дуже важливо, якщо у вас є окремі /binта /bin64. Якщо ви хочете їх, ви можете створити їх і налаштувати відповідну систему.

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


Ваші ls -lприклади не особливо німецькі. Що було б корисно - це результат ls -l /lib /lib64, який, ймовірно, показує, що /libсама по собі є симпосиланням.
chrylis -на страйк-

Ви мали на увазі ls -ld, і ні, /libце не є симпосиланнями в моїй Slackware 14.2системі.
Аркадіуш Драбчик

Бібліотеки мають різні md5суми: dfd029d25c58831bc5db671aec99a36f /lib64/libc.so.6, 987e7b736f316cc8da87ca2f38dae93e /lib/libc.so.6.
Аркадіуш Драбчик

2
У цьому випадку показ символьної посилання в каталозі не з'єднується з цитуванням.
chrylis

1
LD_TRACE_LOADED_OBJECTS = 1 застарілий через отвір у захисті, і ldd більше не використовує його. Причина: ldd / шлях / до / зловмисно-статичний-бінарний використовувався для захоплення систем, тому що sysadmins очікував, що ldd лише дивиться на бінарне, а не запускає його. Крім того, перевірка на статичність чи ні є неадекватною, оскільки двійковий файл може бути побудований для використання зловмисного завантажувача.
Джошуа

22

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.