Pertama, mengapa ada /lib
yang terpisah dan /lib64
:
Standar Hierarki Filesystem yang memisahkan /lib
dan /lib64
ada karena:
10.1. Mungkin ada satu atau lebih varian direktori /lib pada sistem yang mendukung lebih dari satu format biner yang memerlukan pustaka terpisah. (...) Ini biasanya digunakan untuk dukungan 64-bit atau 32-bit pada sistem yang mendukung banyak format biner, tetapi memerlukan pustaka dengan nama yang sama. Dalam hal ini, /lib32 dan /lib64 mungkin merupakan direktori pustaka, dan /lib merupakan symlink ke salah satunya.
Di Slackware 14.2 saya misalnya ada /lib
dan /lib64
direktori masing-masing untuk pustaka 32-bit dan 64-bit meskipun/lib
bukan 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.6
perpustakaan di /lib
dan /lib64
.
Setiap biner ELF yang dibangun secara dinamis berisi jalur hardcode ke juru bahasa, dalam hal ini /lib/ld-linux.so.2
atau /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 juru bahasa adalah memuat pustaka bersama yang diperlukan. Anda dapat bertanya kepada juru bahasa GNU pustaka apa yang akan dimuat tanpa menjalankan biner menggunakan LD_TRACE_LOADED_OBJECTS=1
atau ldd
bungkus:
$ 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, juru bahasa tertentu tahu persis ke mana harus mencari perpustakaan - versi 32-bit mencari perpustakaan di /lib
dan versi 64-bit mencari pustaka di /lib64
.
Standar FHS mengatakan hal berikut tentang /bin
:
/bin berisi perintah yang dapat digunakan oleh administrator sistem dan pengguna, tetapi diperlukan saat tidak ada sistem file lain yang dipasang (misalnya dalam mode pengguna tunggal). Mungkin juga berisi perintah yang digunakan secara tidak langsung oleh skrip.
IMO alasan mengapa tidak ada /bin
yang terpisah dan /bin64
adalah jika kita memiliki file dengan nama yang sama di kedua direktori ini, kita tidak dapat memanggil salah satunya secara langsung karena kita harus memasukkan /bin
atau /bin64
pertama di$PATH
.
Namun, perhatikan bahwa di atas hanyalah konvensi - kernel Linux tidak terlalu peduli jika Anda memiliki /bin
terpisah dan /bin64
.Jika Anda menginginkannya, Anda dapat membuatnya dan mengatur sistem Anda sesuai dengan itu.
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, tentu saja Anda dapat mengkompilasi dan menerapkannya secara manual), dan juga struktur direktori sangat berbeda .
Alasannya adalah direktori lib/lib64 dapat berisi file yang kebetulan memiliki nama yang sama karena itu adalah perpustakaan yang dibagikan dengan beragam program. Menempatkan mereka di direktori terpisah menyelesaikan konflik. Ada (biasanya...) tidak ada alasan bagus untuk mendistribusikan file executable dengan nama yang sama pada sistem yang sama yaitu 32/64-bit, tetapi karena mungkin ada campuran file executable, pustaka bersama harus disediakan.