GNU/Linux >> Tutoriels Linux >  >> Linux

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

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.


Linux
  1. Linux - Pourquoi `/dev/ptmx` et `/dev/pts/ptmx` ne sont pas des fichiers de périphérique ?

  2. Existe-t-il des compilateurs ou des runtimes C "ésotériques" (étranges) mais conformes aux normes ?

  3. La sortie de la commande `tty` et le fichier `/dev/tty` font-ils tous deux référence au terminal de contrôle du processus Bash actuel ?

  4. Pourquoi le descripteur de fichier est-il ouvert et lu une seule fois ?

  5. Il ne reste plus d'espace sur l'appareil, mais la partition n'est qu'à moitié pleine et les inodes sont disponibles

Linux – Pourquoi le vrai et le faux sont-ils si grands ?

Comment diviser une partition monolithique en deux, une pour `/` et une pour `/home` ??

Pourquoi certains Emoji N&B et d'autres sont-ils trop gros ?

Pourquoi y a-t-il une différence dans l'utilisation du disque signalée par df et du ?

Pourquoi le vrai et le faux sont-ils si grands ?

Comment `/etc/hosts` et DNS fonctionnent ensemble pour résoudre les noms d'hôte en adresses IP ?