Mengapa ada `/ lib` dan` / lib64` tetapi hanya `/ bin`?

27

Di laptop saya:

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

Ada dua folder berbeda untuk perpustakaan x86dan x86_64:

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

Mengapa untuk binari hanya ada satu direktori?

NB Saya juga tertarik dengan Android tapi saya harap jawabannya harus sama.

Gluttton
sumber
1
Hanya dalam satu? Saya melihat keduanya /bindan di /sbinsana. Apa pertanyaannya? Apakah Anda bertanya tentang perbedaan antara /libdan /lib64?
Kusalananda
2
@ Kusalananda, maksud saya bahwa tidak ada folder independen untuk x86_64(tidak untuk /bintidak untuk /sbin).
Gluttton
7
IMO OP ingin tahu mengapa tidak ada /bin64.
Arkadiusz Drabczyk
Kira-kira satu aplikasi yang diuntungkan dari memiliki versi 32-bit dan 64-bit (WINE) menyiasatinya dengan memiliki berbagai binari ( wine*32dan wine*64).
Ignacio Vazquez-Abrams
1
@ IgnacioVazquez-Abrams: perlu juga dikatakan bahwa Anda menautkan binari ke perpustakaan, bukan sebaliknya. Jadi binari tidak perlu dipartisi dengan 32/64-bitness.
smci

Jawaban:

25

Pertama, mengapa ada yang terpisah /libdan /lib64:

The Filesystem Hierarchy Standard menyebutkan bahwa terpisah /libdan /lib64eksis karena:

10.1. Mungkin ada satu atau lebih varian direktori / lib pada sistem yang mendukung lebih dari satu format biner yang membutuhkan pustaka yang terpisah. (...) Ini biasanya digunakan untuk dukungan 64-bit atau 32-bit pada sistem yang mendukung berbagai format biner, tetapi membutuhkan pustaka dengan nama yang sama. Dalam hal ini, / lib32 dan / lib64 mungkin direktori pustaka, dan / lib symlink ke salah satunya.

Pada Slackware 14.2 saya misalnya ada /libdan /lib64 direktori masing-masing untuk pustaka 32-bit dan 64-bit meskipun /libtidak sebagai symlink seperti yang disarankan oleh cuplikan 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

Ada dua libc.so.6perpustakaan di /libdan /lib64.

Setiap biner ELF yang dibangun secara dinamis berisi jalur hardcod ke interpreter, dalam hal ini salah satu /lib/ld-linux.so.2atau /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]

Tugas penerjemah adalah memuat pustaka bersama yang diperlukan. Anda bisa bertanya kepada penerjemah GNU perpustakaan apa yang akan dimuat tanpa menjalankan biner LD_TRACE_LOADED_OBJECTS=1atau lddpembungkus:

$ 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)

Seperti yang Anda lihat, penerjemah yang diberikan tahu persis di mana mencari perpustakaan - Versi 32-bit mencari perpustakaan /libdan versi 64-bit mencari perpustakaan di /lib64.

Standar FHS mengatakan hal berikut tentang /bin:

/ bin berisi perintah yang dapat digunakan oleh administrator sistem dan oleh pengguna, tetapi yang diperlukan ketika tidak ada sistem file lain yang dipasang (misalnya dalam mode pengguna tunggal). Ini juga dapat berisi perintah yang digunakan secara tidak langsung oleh skrip.

IMO alasan mengapa tidak ada yang terpisah /bindan /bin64adalah bahwa jika kita memiliki file dengan nama yang sama di kedua direktori ini kita tidak bisa menyebut salah satu dari mereka tidak langsung karena kita harus menempatkan /binatau /bin64pertama dalam $PATH.

Namun, perhatikan bahwa di atas hanyalah konvensi - kernel Linux tidak terlalu peduli jika Anda memiliki /bindan terpisah /bin64. Jika Anda menginginkannya, Anda dapat membuatnya dan mengatur sistem Anda sesuai.

Anda juga menyebutkan Android - perhatikan bahwa kecuali untuk menjalankan kernel Linux yang dimodifikasi itu tidak ada hubungannya dengan sistem GNU seperti Ubuntu - tidak ada glibc, tidak ada bash (secara default, Anda tentu saja dapat mengkompilasi dan menyebarkannya secara manual), dan juga struktur direktori sama sekali berbeda.

Arkadiusz Drabczyk
sumber
ls -lContoh Anda tidak terlalu erat. Apa yang akan berguna adalah output dari ls -l /lib /lib64, yang mungkin menunjukkan bahwa /libdirinya adalah sebuah symlink.
chrylis -on strike-
Maksud Anda ls -ld, dan tidak, /libbukan symlink di Slackware 14.2sistem saya .
Arkadiusz Drabczyk
Perpustakaan memiliki md5sums yang berbeda: dfd029d25c58831bc5db671aec99a36f /lib64/libc.so.6, 987e7b736f316cc8da87ca2f38dae93e /lib/libc.so.6.
Arkadiusz Drabczyk
2
Dalam hal itu, menunjukkan symlinks di-direktori tidak terhubung ke kutipan.
chrylis -on strike-
1
LD_TRACE_LOADED_OBJECTS = 1 sudah usang karena celah keamanan dan ldd tidak menggunakannya lagi. Alasan: ldd / path / ke / malicious-static-binary digunakan untuk mengambil alih sistem karena sysadmin mengharapkan ldd untuk hanya melihat biner tidak menjalankannya. Juga, memeriksa statis atau tidak tidak memadai karena biner dapat dibangun untuk menggunakan loader jahat sebagai gantinya.
Joshua
22

Alasannya adalah bahwa direktori lib / lib64 dapat berisi file yang kebetulan memiliki nama yang sama karena itu adalah perpustakaan yang dibagikan dengan berbagai program. Menempatkan mereka di direktori terpisah menyelesaikan konflik. Tidak ada (biasanya ...) tidak ada alasan yang baik untuk mendistribusikan executable dengan nama yang sama pada sistem yang sama yaitu 32/64-bit, tetapi karena mungkin ada campuran executable, perpustakaan bersama harus disediakan.

Thomas Dickey
sumber