Qu'est ce qu'un fichier objet en C?
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.
5 réponses
Un fichier objet est la sortie réelle de la phase de compilation. C'est principalement du code machine, mais a des informations qui permettent à un éditeur de liens de voir quels symboles sont dedans 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 exécutable (en supposant qu'il peut, c'est-à-dire qu'il n'y a pas de symboles dupliqués ou indéfinis). Beaucoup de compilateurs le feront pour vous (lisez: ils exécutent l'éditeur de liens par eux-mêmes) si vous ne leur dites pas de "simplement compiler" en utilisant des options de ligne de commande. (-c
est une option commune "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 reliant les fichiers objet.
Le fichier objet contient des instructions de bas niveau qui peuvent être comprises par le processeur. 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 en utilisant le langage d'assemblage puis traiter le code du langage d'assemblage (représenté en anglais) en langage machine (représenté en hexadécimal) à l'aide d'un assembleur.
Voici un flux de haut niveau typique pour ce processus pour le code dans un langage de haut niveau tel que C
--> passe par le pré-processeur
--> pour donner du code optimisé, toujours en C
--> passe par le compilateur
-- > pour donner le code d'assemblage
--> passe par un assembleur
-- > pour donner du code en langage machine qui est stocké dans des fichiers objet
--> passe par l'éditeur de liens
--> pour obtenir un fichier exécutable.
Ce flux peut avoir quelques variations par exemple la plupart des compilateurs peuvent générer directement le code du langage machine, sans passer par un assembleur. De même, ils peuvent faire le pré-traitement pour vous. Pourtant, il est agréable de briser les constituants pour une meilleure compréhension.
Il y a 3 types de fichiers objet.
Fichiers objets Relocalisables
Contient du code machine sous une forme qui peut être combinée avec d'autres fichiers objet relocables 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: le préprocesseur (cpp) s'exécuterait sur A. C. Sa sortie (toujours source) sera introduite dans le compilateur (cc1). Sa sortie (assembly) sera introduit dans l'assembleur (as), qui produira le relocatable object file
. Ce fichier contient du code objet et des métadonnées de liaison (et peut déboguer si -g
a été utilisé), et n'est pas directement exécutable.
Fichiers objets partagés
Type spécial de fichier objet relocable qui peut être chargé dynamiquement, soit au moment du chargement, soit au moment de l'exécution. Les bibliothèques partagées sont ce genre d'objets.
Fichiers objet exécutables
Ils contiennent du 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 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 de même type. Il utilise symbol resolution
et relocation
.
Bonus:
Lors de la liaison par rapport à un static library
, les fonctions référencées dans les objets d'entrée sont copiées dans exécutable.
Avec dynamic libraries
, une table de symboles est créée à la place qui permettra une liaison dynamique avec les fonctions/globals de la bibliothèque. Ainsi, le résultat est un fichier objet partiellement exécutable, car il dépend de la bibliothèque. (en termes simples, si la bibliothèque a disparu, le fichier ne peut plus s'exécuter).
Le processus de liaison peut se faire comme suit:
ld a.o -o myexecutable
La commande: gcc a.c -o myexecutable
va invoquer toutes les commandes mentionnées au point 1 et au point 3 (rpc -> cc1 -> as -> ld1)
1: est en fait collect2, qui est un wrapper sur ld.
Un objet fichier est juste ce que vous obtenez lorsque vous compilez un (ou plusieurs) fichier source(s).
Il peut s'agir soit d'un exécutable ou d'une bibliothèque entièrement terminée, soit de fichiers intermédiaires.
Les fichiers d'objet contiennent généralement du code natif, des informations d'éditeur de liens, des symboles de débogage, etc.
Code Objet sont des codes tat dépendent des fonctions, des symboles, du texte pour exécuter la machine. Tout comme les anciennes machines télex qui nécessitaient le télétypage pour envoyer des signaux à d'autres Machines télex. De la même manière, le processeur nécessite du code binaire pour exécuter la machine. Le fichier objet est comme le code binaire mais n'est pas lié. La liaison crée des fichiers supplémentaires afin que l'utilisateur n'ait pas besoin d'avoir un compilateur comme le langage C. L'utilisateur peut ouvrir directement le fichier exe une fois que le fichier objet est lié à un compilateur comme c langue ou vb , etc.