Innanzitutto, perché ci sono separati /lib
e /lib64
:
Lo standard di gerarchia dei filesystem
menziona la separazione /lib
e l' /lib64
esistenza perché:
10.1. Potrebbero esserci una o più varianti della directory / lib su sistemi che supportano più di un formato binario che richiede librerie separate. (...) Questo è comunemente usato per il supporto a 64 o 32 bit su sistemi che supportano più formati binari, ma richiedono librerie con lo stesso nome. In questo caso, / lib32 e / lib64 potrebbero essere le directory della libreria e / lib un link simbolico a una di esse.
Sul mio Slackware 14.2 per esempio ci sono /lib
e /lib64
directory rispettivamente per le librerie a 32 e 64 bit anche se
/lib
non è un collegamento simbolico come lo snippet di FHS suggerirebbe:
$ 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
Ci sono due libc.so.6
librerie in /lib
e /lib64
.
Ogni binario ELF creato dinamicamente
contiene un percorso hardcoded all'interprete, in questo caso
/lib/ld-linux.so.2
o /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]
Il compito dell'interprete è caricare le librerie condivise necessarie. Puoi chiedere a un interprete GNU quali librerie caricare senza nemmeno usare un binario LD_TRACE_LOADED_OBJECTS=1
o un ldd
wrapper:
$ 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)
Come puoi vedere, un determinato interprete sa esattamente dove cercare le librerie: la versione a 32 bit cerca le librerie /lib
e la versione a 64 bit cerca le librerie /lib64
.
Lo standard FHS afferma quanto segue /bin
:
/ bin contiene comandi che possono essere utilizzati sia dall'amministratore di sistema che dagli utenti, ma che sono richiesti quando non sono montati altri file system (ad es. in modalità utente singolo). Può anche contenere comandi utilizzati indirettamente dagli script.
IMO il motivo per cui non ci sono distinti /bin
ed /bin64
è che se avessimo il file con lo stesso nome in entrambe queste directory non potremmo chiamarne uno indirettamente perché dovremmo inserire /bin
o /bin64
prima
$PATH
.
Tuttavia, nota che quanto sopra è solo la convenzione: il kernel di Linux non importa se hai separato /bin
e /bin64
. Se li desideri, puoi crearli e configurare il tuo sistema di conseguenza.
Hai anche menzionato Android - nota che, tranne per l'esecuzione di un kernel Linux modificato, non ha nulla a che fare con i sistemi GNU come Ubuntu - no glibc, no bash (per impostazione predefinita, puoi ovviamente compilarlo e distribuirlo manualmente) e anche la struttura delle directory è completamente diverso.
/bin
e/sbin
lì. Qual'è la domanda? Stai chiedendo la differenza tra/lib
e/lib64
?