Maison  >  Article  >  développement back-end  >  Quels fichiers sont générés après compilation des fichiers sources en langage C ?

Quels fichiers sont générés après compilation des fichiers sources en langage C ?

青灯夜游
青灯夜游original
2022-11-23 19:44:5812530parcourir

Le langage C se compile pour générer un fichier binaire ".OBJ" (fichier objet). En langage C, une fois le programme source (fichier .c) compilé par le compilateur, un fichier binaire (appelé fichier objet) avec le suffixe « .OBJ » sera finalement généré, on l'appelle un « lien » Le logiciel ; connecte ce fichier ".OBJ" avec diverses fonctions de bibliothèque fournies par le langage C pour générer un fichier exécutable avec le suffixe ".EXE".

Quels fichiers sont générés après compilation des fichiers sources en langage C ?

L'environnement d'exploitation de ce tutoriel : système Windows 7, version c99, ordinateur Dell G3.

Compilation de fichiers sources du langage C

Le nom suffixe du fichier source du langage C est ".c", le nom suffixe du fichier compilé est ".obj", et le nom suffixe du fichier exécutable connecté est ".exe".

Étapes pour créer un programme en langage C :

  • Édition : Il s'agit de créer et de modifier le code source du programme C - le programme que nous écrivons est appelé code source.

  • Compilation : Il s'agit de convertir le code source en langage machine. La sortie du compilateur devient le code objet et le fichier qui les stocke est appelé fichier objet. L'extension est .o ou .obj. (Cette partie de la compilation fait référence au langage assembleur compilant l'assembleur ou au langage de haut niveau compilateur du compilateur)

  • Lien : L'éditeur de liens combine le code source en différents modules générés par le compilateur, puis l'ajoute à partir de la bibliothèque de programmes fournie. par le langage C Modules de code nécessaires et combinez-les dans un fichier exécutable. L'extension est .exe sous Windows et n'a pas d'extension sous Unix.

  • Exécuter : Exécutez le programme.

Une fois le programme source du langage C compilé par le compilateur du langage C, un fichier binaire (appelé fichier objet) avec le suffixe ".OBJ" est généré. Enfin, un logiciel appelé "Link" est utilisé. Fichier ".OBJ" avec diverses fonctions de bibliothèque fournies par le langage C pour générer un fichier exécutable avec le suffixe ".EXE". Évidemment, le langage C ne peut pas être exécuté immédiatement.

Le schéma du processus est le suivant :

Quels fichiers sont générés après compilation des fichiers sources en langage C ?

Comme vous pouvez le voir sur l'image, le processus de compilation de l'ensemble du code est divisé en deux processus : la compilation et la liaison correspondent à la partie entourée d'accolades dans le. figure, et le reste est le processus de liaison.

Processus de compilation

  • Le processus de compilation peut être divisé en deux étapes : compilation et assemblage.

Compilation : La compilation consiste à lire le programme source (flux de caractères), à l'analyser lexicalement et grammaticalement et à convertir les instructions du langage de haut niveau en code assembleur fonctionnellement équivalent. Le processus de compilation du fichier source comprend deux principaux. étapes :

La première étape est l'étape de prétraitement, qui a lieu avant l'étape de compilation formelle. La phase de prétraitement modifiera le contenu du fichier source en fonction des directives de prétraitement qui ont été placées dans le fichier. Par exemple, la directive #include est une directive de prétraitement qui ajoute le contenu du fichier d'en-tête au fichier .cpp. Cette méthode de modification des fichiers sources avant compilation offre une grande flexibilité pour s'adapter aux contraintes des différents environnements informatiques et systèmes d'exploitation. Le code requis pour un environnement peut être différent du code requis pour un autre environnement car le matériel ou les systèmes d'exploitation disponibles sont différents. Dans de nombreux cas, vous pouvez mettre le code de différents environnements dans le même fichier, puis modifier le code pendant la phase de prétraitement pour l'adapter à l'environnement actuel.

Traitant principalement des aspects suivants :

  • Instructions de définition de macro, telles que #define a b
    • Pour ce genre de pseudo-instruction, tout ce que la précompilation a à faire est de remplacer tous les a par b dans le programme, mais a en tant que constante de chaîne n'est pas remplacé. Il existe également #undef, qui annulera la définition d'une certaine macro afin que les futures occurrences de la chaîne ne soient plus remplacées.
  • Directives de compilation conditionnelles telles que #ifdef, #ifndef, #else, #elif, #endif, etc.
    • L'introduction de ces pseudo-instructions permet aux programmeurs de décider quels codes traiter par le compilateur en définissant différentes macros. Le précompilateur filtrera le code inutile en fonction des fichiers pertinents.
  • Le fichier d'en-tête contient des instructions, telles que #include 'FileName' ou #include etc. .
    • Dans les fichiers d'en-tête, la directive #define est généralement utilisée pour définir un grand nombre de macros (les plus courantes sont des constantes de caractères), et contient également des déclarations de divers symboles externes. L'objectif principal de l'utilisation des fichiers d'en-tête est de rendre certaines définitions disponibles pour plusieurs programmes sources C différents. Car dans le programme source C qui doit utiliser ces définitions, il vous suffit d'ajouter une instruction #include, sans avoir à répéter ces définitions dans ce fichier. Le précompilateur ajoutera toutes les définitions du fichier d'en-tête au fichier de sortie qu'il génère pour traitement par le compilateur. Les fichiers d'en-tête inclus dans le programme source C peuvent être fournis par le système. Ces fichiers d'en-tête sont généralement placés dans le répertoire /usr/include. Utilisez des crochets angulaires () pour les #inclure dans le programme. De plus, les développeurs peuvent également définir leurs propres fichiers d'en-tête. Ces fichiers sont généralement placés dans le même répertoire que le programme source C. Dans ce cas, des guillemets doubles ('') doivent être utilisés dans #include.
  • Symboles spéciaux, le précompilateur peut reconnaître certains symboles spéciaux
    • Par exemple, le logo LINE apparaissant dans le programme source sera interprété comme le numéro de ligne actuel (nombre décimal), et FILE sera interprété comme le nom du programme source C actuellement compilé. Le précompilateur remplacera les occurrences de ces chaînes dans le programme source par les valeurs appropriées.

Ce que fait le précompilateur, c'est essentiellement de "remplacer" le programme source. Après cette substitution, un fichier de sortie sans définitions de macro, sans instructions de compilation conditionnelle et sans symboles spéciaux est généré. La signification de ce fichier est la même que celle du fichier source non prétraité, mais le contenu est différent. Ensuite, ce fichier de sortie est traduit en instructions machine en tant que sortie du compilateur.

La deuxième étape de compilation et d'optimisation. Dans le fichier de sortie précompilé, il n'y a que des constantes, telles que des nombres, des chaînes, des définitions de variables et des mots-clés en langage C, tels que main, if, else, for. ,pendant que,{,}, +,-,*,etc.

  • Le travail du compilateur consiste à utiliser l'analyse lexicale et l'analyse syntaxique pour confirmer que toutes les instructions sont conformes aux règles grammaticales, puis à les traduire en représentation de code intermédiaire équivalente ou en code assembleur.
  • Le traitement d'optimisation est une technologie relativement difficile dans le système de compilation. Les problèmes que cela implique ne sont pas seulement liés à la technologie de compilation elle-même, mais ont également beaucoup à voir avec l'environnement matériel de la machine. Une partie de l'optimisation consiste à optimiser le code intermédiaire. Cette optimisation est indépendante de l'ordinateur spécifique. Un autre type d'optimisation vise principalement la génération de code cible.
  • Pour l'ancienne optimisation, le travail principal consiste à supprimer les expressions publiques, à optimiser les boucles (extraction de code, affaiblissement de la force, modification des conditions de contrôle de boucle, fusion de quantités connues, etc.), propagation de copie et suppression des affectations inutiles, etc. attendez.
  • Ce dernier type d'optimisation est étroitement lié à la structure matérielle de la machine. La chose la plus importante à considérer est de savoir comment utiliser pleinement les valeurs des variables pertinentes stockées dans chaque registre matériel de la machine pour en réduire le nombre. des accès mémoire. De plus, comment apporter quelques ajustements aux instructions en fonction des caractéristiques des instructions d'exécution du matériel machine (telles que pipeline, RISC, CISC, VLIW, etc.) pour rendre le code cible plus court et l'efficacité d'exécution plus élevée est également un sujet de recherche important. .

Assembly : L'assemblage fait en fait référence au processus de traduction du code du langage assembleur en instructions de la machine cible. Pour chaque programme source en langage C traité par le système de traduction, le fichier cible correspondant sera finalement obtenu grâce à ce traitement. Ce qui est stocké dans le fichier cible est le code de langage machine de la cible qui est équivalent au programme source. Les fichiers objets sont composés de segments. Il y a généralement au moins deux sections dans un fichier objet :

  • Section Code : Cette section contient principalement les instructions du programme. Ce segment est généralement lisible et exécutable, mais généralement non inscriptible.
  • Segment de données : il stocke principalement diverses variables globales ou données statiques qui sont utilisées dans le programme. Généralement, les segments de données sont lisibles, inscriptibles et exécutables.

Il existe trois principaux types de fichiers objets dans l'environnement UNIX :

  • Fichiers relocalisables : contient du code et des données adaptés à la liaison avec d'autres fichiers objets pour créer un fichier objet exécutable ou partagé.
  • Fichier objet partagé : ce fichier stocke le code et les données adaptés à la liaison dans deux contextes. La première est que l'éditeur de liens peut le traiter avec d'autres fichiers transférables et fichiers objets partagés pour créer un autre fichier objet ; la seconde est que l'éditeur de liens dynamique peut le traiter avec un autre fichier exécutable et d'autres fichiers objets partagés. Combinés ensemble, ils créent un processus. image.
  • Fichier exécutable : Il contient un fichier qui peut être exécuté par un processus créé par le système d'exploitation. Ce que génère l'assembleur est en fait le premier type de fichier objet. Pour ces deux derniers, un autre traitement est nécessaire pour les obtenir. C'est le travail de l'éditeur de liens.

Processus de liaison :

Le fichier objet généré par l'assembleur ne peut pas être exécuté immédiatement et il peut y avoir de nombreux problèmes non résolus.

  • Par exemple, Une fonction dans un fichier source peut faire référence à un symbole défini dans un autre fichier source (comme une variable ou un appel de fonction, etc.) ; , etc. Tous ces problèmes doivent être résolus par l'éditeur de liens.
  • Le travail principal de l'éditeur de liens est de connecter les fichiers cibles associés les uns aux autres, c'est-à-dire de connecter les symboles référencés dans un fichier avec la définition du symbole dans un autre fichier, afin que tous ces fichiers cibles deviennent un ensemble exploitable unifié. l'ensemble que le système charge et exécute.

 Selon les différentes méthodes de liaison d'une même fonction de bibliothèque spécifiées par le développeur, le traitement des liens peut être divisé en deux types :

  • Lien statique : Dans cette méthode de liaison, le code de la fonction sera téléchargé depuis le bibliothèque de liens statiques où il se trouve Copié dans le programme exécutable final. De cette manière, ces codes seront chargés dans l’espace d’adressage virtuel du processus lors de l’exécution du programme. Une bibliothèque de liens statiques est en fait une collection de fichiers objets, chacun contenant le code d'une ou d'un groupe de fonctions associées dans la bibliothèque.
  • Liaison dynamique : Dans cette méthode, le code de la fonction est placé dans un fichier objet appelé bibliothèque de liens dynamiques ou objet partagé. Ce que fait l'éditeur de liens à ce moment-là, c'est d'enregistrer le nom de l'objet partagé et une petite quantité d'autres informations d'enregistrement dans le programme exécutable final. Lorsque ce fichier exécutable est exécuté, l'intégralité du contenu de la bibliothèque de liens dynamiques sera mappée dans l'espace d'adressage virtuel du processus correspondant au moment de l'exécution. L'éditeur de liens dynamique trouvera le code de fonction correspondant en fonction des informations enregistrées dans le programme exécutable.

Pour les appels de fonction dans des fichiers exécutables, une liaison dynamique ou une liaison statique peut être utilisée respectivement. L'utilisation de liaisons dynamiques peut raccourcir le fichier exécutable final et économiser de la mémoire lorsqu'un objet partagé est utilisé par plusieurs processus, car une seule copie du code de cet objet partagé doit être enregistrée en mémoire. Mais cela ne signifie pas nécessairement que l’utilisation de liens dynamiques est supérieure à l’utilisation de liens statiques. Dans certains cas, la liaison dynamique peut nuire aux performances.

Recommandations associées : "Tutoriel vidéo C"

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn