Tout d'abord, pourquoi y a-t-il des /lib
séparés et /lib64
:
Le Filesystem Hierarchy Standardmentions qui séparent /lib
et /lib64
existent parce que :
10.1. Il peut exister une ou plusieurs variantes du répertoire /lib sur les systèmes prenant en charge plusieurs formats binaires nécessitant des bibliothèques distinctes. (...) Ceci est couramment utilisé pour le support 64 bits ou 32 bits sur les systèmes qui prennent en charge plusieurs formats binaires, mais nécessitent des bibliothèques du même nom. Dans ce cas, /lib32 et /lib64 pourraient être les répertoires de la bibliothèque, et /lib un lien symbolique vers l'un d'eux.
Sur ma Slackware 14.2 par exemple il y a /lib
et /lib64
répertoires pour les bibliothèques 32 bits et 64 bits respectivement même si /lib
n'est pas un lien symbolique comme le suggère l'extrait 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
Il y a deux libc.so.6
bibliothèques en /lib
et /lib64
.
Chaque binaire ELF construit dynamiquement contient un chemin codé en dur vers l'interpréteur, dans ce cas soit/lib/ld-linux.so.2
ou /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]
Le travail de l'interpréteur est de charger les bibliothèques partagées nécessaires. Vous pouvez demander à un interpréteur GNU quelles bibliothèques il chargerait sans même exécuter un binaire en utilisant LD_TRACE_LOADED_OBJECTS=1
ou un ldd
emballage :
$ 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)
Comme vous pouvez le voir, un interpréteur donné sait exactement où chercher les bibliothèques - la version 32 bits recherche les bibliothèques dans /lib
et la version 64 bits recherche les bibliothèques dans /lib64
.
La norme FHS dit ce qui suit à propos de /bin
:
/bin contient des commandes qui peuvent être utilisées à la fois par l'administrateur système et par les utilisateurs, mais qui sont nécessaires lorsqu'aucun autre système de fichiers n'est monté (par exemple en mode mono-utilisateur). Il peut également contenir des commandes utilisées indirectement par des scripts.
IMO la raison pour laquelle il n'y a pas de /bin
séparé et /bin64
est que si nous avions le fichier avec le même nom dans ces deux répertoires, nous ne pourrions pas appeler l'un d'eux directement car nous devrions mettre /bin
ou /bin64
premier à$PATH
.
Cependant, notez que ce qui précède n'est que la convention - le Linuxkernel ne se soucie pas vraiment si vous avez un /bin
séparé et /bin64
.Si vous les souhaitez, vous pouvez les créer et configurer votre système en conséquence.
Vous avez également mentionné Android - notez qu'à l'exception de l'exécution d'un noyau Linux modifié, cela n'a rien à voir avec les systèmes GNU tels qu'Ubuntu - pas de glibc, pas de bash (par défaut, vous pouvez bien sûr le compiler et le déployer manuellement), et aussi la structure du répertoire est complètement différente .
La raison est que les répertoires lib/lib64 peuvent contenir des fichiers qui ont le même nom parce que ce sont des bibliothèques partagées avec divers programmes. Les placer dans des répertoires séparés résout le conflit. Il n'y a (généralement ...) aucune bonne raison de distribuer des exécutables du même nom sur le même système qui sont 32/64 bits, mais comme il peut y avoir un mélange d'exécutables, les bibliothèques partagées doivent être fournies.