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.
c
compilation
linker
object-files
Pithikos
la source
la source
Réponses:
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. (
-c
est une option courante "compiler; ne pas lier".)la source
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 objets.
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.
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.
la source
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.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) 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-g
mé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 files
est un fichierexecutable 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 utilisesymbol resolution
etrelocation
.Bonus lu:
Lors de la liaison avec un,
static library
les fonctions référencées dans les objets d'entrée sont copiées dans l'exécutable final. Avecdynamic libraries
une 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 myexecutable
invoquera 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.
la source
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.
la source
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.
la source