web-dev-qa-db-fra.com

Quelle est la différence entre un fichier binaire et une bibliothèque?

J'essaie de comprendre la norme de hiérarchie du système de fichiers. J'ai levé les deux binaires et les bibliothèques, et comme je le comprends actuellement:

binaires sont des fichiers de code lisible par ordinateur en format binaire, qui contrôlent la CPU et le processeur directement avec des bits.

Bibliothèques sont des fonctions utilisables par divers programmes, pour des raisons de commodité - comme lorsque vous avez besoin d'un module en JavaScript de PHP.

Cette compréhension est-elle correcte? Si c'est le cas, pourquoi séparons-nous encore des bibliothèques et des binaires? Certaines bibliothèques sont binaires, non? Et certains binaires (chat, moins, date, rm, cp, etc.) sont utilisés et réutilisés comme s'il s'agissait de bibliothèques ... une personne peut-elle aider à expliquer la différence et aidez-moi à trouver de meilleures définitions pour ces deux mots? Merci.

11
houallet

Votre compréhension est principalement correcte, mais il y a deux choses supplémentaires à considérer:

  1. "Binary" fait référence à quelque chose qui n'est pas lisible par l'homme. Cela fait généralement référence au code de la machine, mais de nombreux autres fichiers sont également des fichiers binaires en ce sens, la plupart des formats multimédia étant un bon exemple. La FHS a cependant une utilisation plus spécifique pour le terme.
  2. Les bibliothèques peuvent être du code binaire. En fait, la plupart des trucs de /lib vont être des bibliothèques compilées au code de la machine.
  3. Alors que des choses comme cat sont utilisées dans Shell Script comme des appels vers le code dans les bibliothèques, ce ne sont pas des bibliothèques au sens de la FHS car elles peuvent être exécutées seules.

À la suite de ces points, la terminologie la plus courante chez les personnes qui n'écrivent pas les documents de normalisation est la suivante:

  • Fichiers d'objet: Ceux-ci sont compilés de manière native Code de la machine, mais peuvent même pas courir ou être appelable. Ils ont généralement une extension .o à moins de tomber dans l'une des autres catégories et ne sont presque jamais vues sur la plupart des systèmes, sauf lors de la construction de logiciels. Je les ai énumérées ici car ils sont importants pour comprendre quelques choses ci-dessous.

  • Fichiers exécutables: Ce sont des fichiers constitués de code principalement autonome pouvant être exécuté directement. Ils peuvent être soit des fichiers d'objet spécialement formatés qui peuvent être chargés directement par le noyau (des choses comme cat, bash, et python sont tous ce type d'exécutable) ou sont tous ce type d'exécutable) ou interprété par un programme intermédiaire qui est lui-même exécutable (Minecraft, pydoc, et cowsay sont tous des exemples de ce type d'exécutable). Les exécutables du premier type n'ont presque jamais d'extension de fichier sur les systèmes UNIX, tandis que les exécutables du deuxième type peuvent ou non. C'est ce que la FHS se réfère à des "binaires". Ils peuvent être exécutés à partir d'autres exécutables, mais nécessitent des fonctions spéciales d'appeler pour les appeler (fork() et exec() en C et C++, les choses hors du module subprocess en python , etc.) et exécuter comme un processus séparé.

  • Bibliothèques: Ce sont des fichiers contenant du code réutilisable pouvant être invoqué par une autre bibliothèque ou un exécutable. Le code dans les bibliothèques est invoqué (principalement) directement par autre code une fois la bibliothèque chargée (appelée "liaison" lorsque vous parlez du code compilé) et s'exécute dans le même processus que le code l'appelant. Il existe trois types de bibliothèques génériques:

    1. Bibliothèques statiques: Ce sont la variété d'origine. Ils se composent d'un fichier d'archive (généralement format AR) avec un grand nombre de fichiers d'objet à l'intérieur, un pour chaque fonction de la bibliothèque. Les fichiers d'objet sont liés à l'exécutable qui les utilise, de sorte qu'un exécutable qui utilise uniquement des bibliothèques statiques est essentiellement 100% indépendant de tout autre code. Sur les systèmes UNIX, ils ont généralement une extension .a. Le concept de bibliothèques statiques n'existe pas vraiment en dehors des langages de programmation compilés.
    2. Bibliothèques dynamiques: Ce sont le type de bibliothèque le plus courant utilisé aujourd'hui. Une bibliothèque dynamique est un fichier d'objet spécial, typiquement avec une extension .so sur UNIX (.dll est la norme sous Windows), qui est chargée au moment de l'exécution par exécutables qui l'utilisent. La plupart de ce que vous trouverez dans /lib sur les systèmes de production est des bibliothèques dynamiques.
    3. Modules: C'est l'équivalent d'une bibliothèque dynamique pour une langue interprétée. La manipulation est un peu différente de celle d'un langage compilé et contrairement à une langue compilée, il est possible qu'un fichier soit à la fois un module et un exécutable (voir http.server dans la bibliothèque standard Python pour un exemple).
9
Austin Hemmelgarn