По-перше, чому існують окремі /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 (за замовчуванням ви, звичайно, можете компілювати та розгортати його вручну), а також структуру каталогів зовсім інше.
/bin
і/sbin
там. Яке питання? Ви питаєте про різницю між/lib
та/lib64
?