177 votes

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

Je suis en train de lire 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 différence réelle entre tout autre fichier compilé et un fichier objet ?
Je serais heureux si quelqu'un pouvait m'expliquer en langage humain.

0 votes

Une version plus active de ceci : stackoverflow.com/questions/12122446/

0 votes

0 votes

Les fichiers objets ne sont pas spécifiques au C

189voto

cHao Points 42294

Un fichier objet est le véritable résultat de la phase de compilation. Il s'agit principalement de code machine, mais il contient des informations qui permettent à l'éditeur de liens de voir les symboles qu'il contient et ceux dont il a besoin pour fonctionner. (Pour référence, les "symboles" sont essentiellement les noms des objets globaux, des 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 ait pas de symboles dupliqués ou non définis). Beaucoup de compilateurs le feront pour vous (lire : ils exécutent l'éditeur de liens tout seul) si vous ne leur dites pas de "compiler simplement" en utilisant les options de la ligne de commande. ( -c est une option commune "juste compiler ; ne pas lier").

0 votes

En fait, avec la plupart des compilateurs, la sortie de la phase de compilation est du code assembleur, et le compilateur invoque ensuite l'assembleur pour transformer ce code en un fichier objet.

21 votes

@ChrisDodd : C'était souvent le cas avec les anciens compilateurs. De nos jours, un compilateur ne génère pas de code assembleur à moins que vous ne le lui demandiez, et souvent il ne l'utilise pas en interne. Mais de toute façon, l'assemblage serait une sous-phase de la phase de compilation, donc tout cela est discutable.

2 votes

Un seul fichier objet peut-il être exécutable ?

87voto

RHT Points 2022
  1. Un fichier Objet est le fichier compilé lui-même. Il n'y a aucune différence entre les deux.

  2. Un fichier exécutable est formé par la liaison des fichiers Objet.

  3. Le fichier objet contient des instructions de bas niveau qui peuvent être comprises par le 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 en utilisant le langage d'assemblage, puis transformer le code en langage d'assemblage (représenté en anglais) en langage machine (représenté en hexadécimal) en utilisant un assembleur.

Voici un flux de haut niveau typique de ce processus pour un code en langage de haut niveau tel que le C.

--> passe par le pré-processeur

--> pour donner un code optimisé, toujours en C

--> passe par le compilateur

--> pour donner le code d'assemblage

--> passe par un assembleur

--> pour donner un code en langage machine qui est stocké dans des FICHIERS OBJETS

--> passe par Linker

--> 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 en langage machine, sans passer par un assembleur. De même, ils peuvent faire le prétraitement pour vous. Néanmoins, il est bon de séparer les composants pour une meilleure compréhension.

7 votes

Le code optimisé n'est pas généré au stade du préprocesseur ni immédiatement après. Le pré-processeur ne s'occupe que de son propre langage et c'est tout. L'optimisation se produit aux étapes de compilation et d'assemblage.

1 votes

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 la 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 ?

0 votes

Un seul fichier objet ne peut-il pas être également exécutable ?

46voto

Paschalis Points 1732

Il existe 3 types de fichiers objets.

Fichiers d'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.c pour créer son fichier objet avec GCC, vous devez exécuter : gcc a.c -c

Le processus complet serait le suivant : le préprocesseur (cpp) s'exécuterait sur a.c. Sa sortie (toujours source) alimenterait le compilateur (cc1). Sa sortie (assemblage) alimentera l'assembleur (as), qui produira le fichier relocatable object file . Ce fichier contient le code objet et la liaison (et le débogage si -g a été utilisé), et n'est pas directement exécutable.

Fichiers d'objets partagés

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

Fichiers d'objets exécutables

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

Le résultat de l'exécution du linker 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 ex. .data ) vers la section de sortie du même type. Il utilise symbol resolution y relocation .

Bonus de lecture :

Lorsque l'on établit un lien avec un static library les fonctions qui sont 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 qui permettra une liaison 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 au point 1 et au point 3 (cpp -> cc1 -> as -> ld 1 )

1 : il s'agit en fait de collect2, qui est une enveloppe sur ld.

12voto

Mat Points 104488

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

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

2voto

Farhan Points 1

Les fichiers objets sont des codes qui dépendent des fonctions, des symboles et du texte pour exécuter le programme. Tout comme les anciens télex, qui nécessitaient la télétypie pour envoyer des signaux à d'autres télex.

De la même manière que les processeurs ont besoin de code binaire pour fonctionner, les fichiers objets sont comme du code binaire mais non lié. La liaison crée des fichiers supplémentaires pour que l'utilisateur n'ait pas à compiler le langage C lui-même. Les utilisateurs peuvent directement ouvrir le fichier exe une fois que le fichier objet est lié avec un compilateur comme le langage C, ou VB, etc.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X