Qu'est-ce qu'un fichier objet en C?

140

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 un autre fichier compilé et un fichier objet?
Je serais heureux si quelqu'un pouvait expliquer en langage humain.

Pithikos
la source
Une version plus active de ceci: stackoverflow.com/questions/12122446/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Réponses:

153

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 exécutable (en supposant qu'il le peut, c'est-à-dire qu'il n'y a pas de symboles dupliqués ou non définis). Beaucoup de compilateurs le feront pour vous (lire: ils exécutent l'éditeur de liens de leur propre chef) si vous ne leur dites pas de "simplement compiler" en utilisant les options de ligne de commande. ( -cest une option courante "compiler; ne pas lier".)

cHao
la source
En fait, avec la plupart des compilateurs, la sortie de la phase de compilation est du code d'assemblage, et le compilateur appelle ensuite l'assembleur pour le transformer en fichier objet.
Chris Dodd
15
@ChrisDodd: C'était souvent le cas avec les anciens compilateurs. De nos jours, un compilateur ne génère pas de code d'assembly à moins que vous ne le lui demandiez et ne l'utilise souvent pas en interne. Mais de toute façon, l'assemblage serait une sous-phase de la phase de compilation, donc tout cela est sans objet.
cHao
2
un seul fichier objet peut-il être exécutable?
Honey
1
@Honey: En général, non. Même si le fichier objet était dans un format conçu pour l'exécution (ce qu'il n'est fondamentalement jamais), cette partie sur les «symboles dont il a besoin pour fonctionner» tue fondamentalement l'affaire. Même votre "hello world" standard nécessite une liaison avec une bibliothèque d'exécution C.
cHao
74
  1. Un fichier objet est le fichier compilé lui-même. Il n'y a pas de différence entre les deux.

  2. Un fichier exécutable est formé en liant les fichiers objets.

  3. Le fichier objet contient des instructions de bas niveau qui peuvent être comprises par la CPU. C'est pourquoi il est également appelé code machine.

  4. Ce code machine de bas niveau est la représentation binaire des instructions que vous pouvez également écrire directement à l'aide du langage assembleur, puis traiter le code du langage assembleur (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 en 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 OBJECT FILES

-> passe par Linker

-> pour obtenir un fichier exécutable.

Ce flux peut avoir quelques 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 faire le prétraitement pour vous. Pourtant, il est agréable de séparer les électeurs pour une meilleure compréhension.

RHT
la source
5
Le code optimisé n'est pas généré au stade du pré-processeur ni immédiatement après. Le pré-processeur ne traite que sa propre langue et c'est tout. L'optimisation se produit aux étapes de compilation et d'assemblage.
Ignas2526
Le fichier objet que nous obtenons après la compilation est-il le même que le fichier exécutable en langage machine. Je suis confus parce que, vous avez dit que le fichier objet est créé à la deuxième étape de la dernière et dernière étape est le fichier exécutable. Donc, le fichier .0 que nous obtenons après la compilation, est-ce le fichier exécutable?
AV94
un seul fichier objet ne peut-il pas être également exécutable?
Honey
33

Il existe 3 types de fichiers objets.

Fichiers objets déplaçables

Contient du code machine sous une forme qui peut être combinée avec d'autres fichiers objets relocalisables au moment de la liaison, afin de former un fichier objet exécutable.

Si vous avez un a.cfichier 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) fonctionnerait sur ac Sa sortie (source fixe) alimentera le compilateur (cc1). Sa sortie (assemblage) alimentera l'assembleur (as), qui produira le fichier relocatable object file. Ce fichier contient du code objet et des -gmétadonnées de liaison (et de débogage le cas échéant ), et n'est pas directement exécutable.

Fichiers d'objets partagés

Type spécial de fichier objet déplaçable pouvant être chargé dynamiquement, soit au moment du chargement, soit au moment de l'exécution. Les bibliothèques partagées sont un exemple de ces types d'objets.

Fichiers objets exécutables

Contient du code machine qui peut être directement chargé en mémoire (par le chargeur, par exemple execve ) et ensuite exécuté.

Le résultat de l'exécution de l'éditeur de liens sur plusieurs relocatable object filesest un fichier 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) dans la section de sortie de même type. Il utilise symbol resolutionet relocation.

Bonus lu:

Lors de la liaison avec un, static libraryles fonctions référencées dans les objets d'entrée sont copiées dans l'exécutable final. Avec dynamic librariesune table de symboles est créée à la place qui permettra une liaison dynamique avec les fonctions / globaux 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 s'exécuter).

Le processus de liaison peut être effectué comme suit: ld a.o -o myexecutable

La commande: gcc a.c -o myexecutableinvoquera toutes les commandes mentionnées au point 1 et au point 3 (cpp -> cc1 -> as -> ld 1 )

1: est en fait collect2, qui est un wrapper sur ld.

Paschalis
la source
11

Un fichier objet est exactement ce que vous obtenez lorsque vous compilez un (ou plusieurs) fichier (s) source.

Il peut s'agir d'un exécutable ou d'une bibliothèque entièrement complété, 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.

Tapis
la source
2

Les fichiers objets 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 un télétype pour envoyer des signaux à d'autres machines télex.

De la même manière que les processeurs nécessitent du code binaire pour s'exécuter, les fichiers objets sont comme du code binaire mais ne sont pas liés. La liaison crée des fichiers supplémentaires afin que l'utilisateur n'ait pas à avoir à compiler le langage C lui-même. 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.

Farhan
la source