Je lis sur les bibliothèques en C mais je n'ai pas encore trouvé d'explication sur ce qu'est un fichier objet. Quelle est la vraie différence entre tout autre fichier compilé et un fichier objet?
Je serais heureux si quelqu'un pouvait expliquer en langage humain.
Un fichier objet est la sortie réelle de la phase de compilation. Il s’agit principalement de code machine, mais contient des informations qui permettent à un éditeur de liens de voir quels symboles il contient ainsi que les symboles dont il a besoin pour fonctionner. (Pour référence, les "symboles" sont essentiellement des noms d'objets globaux, de fonctions, etc.)
Un éditeur de liens prend tous ces fichiers objets et les combine pour former un seul exécutable (en supposant qu'il le puisse, c'est-à-dire qu'il n'y a pas de symboles en double ou indéfinis). Beaucoup de compilateurs le feront pour vous (lisez: ils exécutent eux-mêmes l'éditeur de liens) si vous ne leur dites pas de "compiler simplement" à l'aide d'options de ligne de commande. (-c
est une option courante "juste compiler; ne pas lier".)
Un fichier objet est le fichier compilé lui-même. Il n'y a pas de différence entre les deux.
Un fichier exécutable est formé en liant les fichiers Object.
Le fichier objet contient des instructions de bas niveau compréhensibles par la CPU. C'est pourquoi on l'appelle aussi code machine.
Ce code machine de bas niveau est la représentation binaire des instructions que vous pouvez également écrire directement à l'aide du langage Assembly, puis traiter le code du langage Assembly (représenté en anglais) en langage machine (représenté en Hex) à l'aide d'un assembleur.
Voici un flux de haut niveau typique pour ce processus pour le code en langage de haut niveau tel que C
-> passe par pré-processeur
-> donner un code optimisé, toujours en C
-> passe par le compilateur
-> donner le code de montage
-> passe par un assembleur
-> pour donner le code en langage machine qui est stocké dans les fichiers OBJECT
-> passe par Linker
-> pour obtenir un fichier exécutable.
Ce flux peut avoir certaines variantes. Par exemple, la plupart des compilateurs peuvent générer directement le code en langage machine sans passer par un assembleur. De même, ils peuvent effectuer le pré-traitement pour vous. Néanmoins, il est agréable de séparer les mandants pour une meilleure compréhension.
Il existe 3 types de fichiers objets.
Contient du code machine sous une forme pouvant être combinée avec d'autres fichiers objets déplaçables au moment du lien afin de former un fichier objet exécutable.
Si vous avez un a.c
fichier source, pour créer son fichier objet avec GCC, vous devez exécuter: gcc a.c -c
Le processus complet serait: préprocesseur (cpp) serait exécuté sur a.c. Sa sortie (source fixe) alimentera le compilateur (cc1). Sa sortie (Assembly) alimentera l'assembleur (as), qui produira le relocatable object file
. Ce fichier contient du code objet et un lien (et un débogage si -g
a été utilisé) métadonnées et n’est pas directement exécutable.
Type spécial de fichier objet déplaçable pouvant être chargé de manière dynamique, au moment du chargement ou à l'exécution. Les bibliothèques partagées sont un exemple de ce type d'objets.
Contient un code machine qui peut être directement chargé en mémoire (par le chargeur, par exemple execve ) et exécuté par la suite.
Le résultat de l'exécution de l'éditeur de liens sur plusieurs relocatable object files
est un executable object file
. L'éditeur de liens fusionne tous les fichiers d'objets d'entrée à partir de la ligne de commande, de gauche à droite, en fusionnant toutes les sections d'entrée de même type (par exemple, .data
) vers la section de sortie du même type. Il utilise symbol resolution
et relocation
.
Lors de la liaison contre un static library
les fonctions référencées dans les objets d'entrée sont copiées dans l'exécutable final. Avec dynamic libraries
une table de symboles est créée à la place, permettant un lien dynamique avec les fonctions/globales de la bibliothèque. Ainsi, le résultat est un fichier objet partiellement exécutable, car il dépend de la bibliothèque. Si la bibliothèque n'existe pas, le fichier ne peut plus être exécuté).
Le processus de liaison peut être effectué comme suit: ld a.o -o myexecutable
La commande: gcc a.c -o myexecutable
invoquera toutes les commandes mentionnées aux points 1 et 3 (cpp -> cc1 -> as -> ld1)
1: est en fait collect2, qui est un wrapper over ld.
Un fichier objet correspond exactement à ce que vous obtenez lorsque vous compilez un (ou plusieurs) fichier (s) source.
Il peut s'agir d'un fichier exécutable ou d'une bibliothèque entièrement terminé, ou de fichiers intermédiaires.
Les fichiers objets contiennent généralement du code natif, des informations sur l'éditeur de liens, des symboles de débogage, etc.
Les fichiers objet sont des codes qui dépendent des fonctions, des symboles et du texte pour exécuter le programme. Tout comme les anciennes machines télex, qui nécessitaient le télétype pour envoyer des signaux à une autre machine télex.
De la même manière que le processeur requiert du code binaire pour s'exécuter, les fichiers objet ressemblent à du code binaire mais ne sont pas liés. La liaison crée des fichiers supplémentaires pour que l'utilisateur n'ait pas à compiler lui-même le langage C. Les utilisateurs peuvent ouvrir directement le fichier exe une fois que le fichier objet est lié à un compilateur comme le langage c, ou vb, etc.