web-dev-qa-db-fra.com

Pourquoi il y a `/ lib` et` / lib64` mais seulement `/ bin`?

Dans mon ordinateur portable:

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

Il existe deux dossiers différents pour les bibliothèques x86 et x86_64:

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

Pourquoi pour les binaires existe un seul répertoire?

P.S. Je suis également intéressé par Android mais j'espère que cette réponse devrait être la même.

27
Gluttton

Tout d'abord, pourquoi il existe des /lib et /lib64:

Le Filesystem Hierarchy Standard mentionne que séparer /lib et /lib64 existe parce que:

10.1. Il peut y avoir une ou plusieurs variantes du répertoire/lib sur les systèmes qui prennent en charge plusieurs formats binaires nécessitant des bibliothèques distinctes. (...) Ceci est couramment utilisé pour la prise en charge 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 peuvent être les répertoires de bibliothèque et/lib un lien symbolique vers l'un d'entre eux.

Sur mon 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 en a deux libc.so.6 bibliothèques dans /lib et /lib64.

Chaque construit dynamiquement binaire ELF 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]

L'interpréteur a pour tâche de charger les bibliothèques partagées nécessaires. Vous pouvez demander à un interprète GNU quelles bibliothèques il chargerait sans même exécuter un binaire en utilisant LD_TRACE_LOADED_OBJECTS=1 ou un wrapper 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)

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 les versions 64 bits recherchent 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 requises lorsqu'aucun autre système de fichiers n'est monté (par exemple en mode mono-utilisateur). Il peut également contenir des commandes qui sont utilisées indirectement par des scripts.

OMI la raison pour laquelle il n'y a pas de /bin et /bin64 est que si nous avions le fichier du même nom dans ces deux répertoires, nous ne pourrions pas appeler l'un d'eux indirectement car nous devions mettre /bin ou /bin64 premier arrivé $PATH.

Cependant, notez que ce qui précède n'est que la convention - le noyau Linux ne se soucie pas vraiment si vous avez des /bin et /bin64. Si vous le souhaitez, vous pouvez les créer et configurer votre système en conséquence.

Vous avez également mentionné Android - notez que, sauf pour exécuter un noyau Linux modifié, cela n'a rien à voir avec GNU des systèmes tels que Ubuntu - pas de glibc, pas de bash ( par défaut, vous pouvez bien sûr le compiler et le déployer manuellement), et la structure du répertoire est également complètement différente.

25

La raison en est que les répertoires lib/lib64 peuvent contenir des fichiers qui ont le même nom car 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 sur le même système des exécutables portant le même nom 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.

22
Thomas Dickey