Linux: compilateur GCC

Kevlavik 2022-07-23 15:05:13 阅读数:844

linuxcompilateurgcc

gcc/g++

  • GCC:GNU Compiler Collection(GUN Collection de compilateurs),Il peut être compiléC、C++、JAV、Fortran、Pascal、Object-CLangues équivalentes.
    • gcc- Oui.GCCDansGUN C Compiler(C Compilateur)
      g++- Oui.GCCDansGUN C++ Compiler(C++Compilateur)
  • Parce que le compilateur est remplaçable,Alors...gccIl n'est pas seulement possible de compilerCDocumentation.Alors...,Plus précisément,:gccAppeléC compiler,Etg++AppeléC++ compiler

gccEtg++Principales différences

  1. Pour .cEt.cppDocumentation,gccComme suit:cEtcppCompilation de fichiers(cEtcppL'intensité syntaxique est différente)

  2. Pour .cEt.cppDocumentation,g++L'unité est considérée commecppCompilation de fichiers

  3. Utiliserg++Lors de la compilation du fichier,g++Les bibliothèques standard sont automatiquement liéesSTL,EtgccPas de lien automatiqueSTL

  4. gccEn compilantCAu moment du dossier,Il y a moins de macros prédéfinies disponibles

  5. gccEn compilantcppAu moment du dossier/g++En compilantcDocuments etcppAu moment du dossier(À ce moment - là.gccEtg++Tous les appels sontcppCompilateur de fichiers),Ajoutez des macros supplémentaires.

  6. En servicegccCompilerc++Au moment du dossier,Pour pouvoir utiliserSTL,Paramètre requis –lstdc++ ,Mais ça ne veut pas dire gcc –lstdc++ Et g++Équivalence,La différence n'est pas que ça.


gccCompilateur

  • gcc Peut être compilé étape par étape ,Prétraitement,Compiler,Compilation, Le dernier lien génère l'exécutable .
    Les fichiers exécutables sontLinux Bits de performance généraux sur le système ELFFichier cible(OBJDocumentation).

  • Vous pouvez obtenir , Fichiers de processus après chaque étape de traitement :
    Insérer la description de l'image ici

    • Peut également être mis en place en une seule étape
    • Insérer la description de l'image ici
  • -static Cette option prend un lien statique vers le fichier généré

  • -shared Cette option utilisera les bibliothèques dynamiques autant que possible,Donc le fichier généré est plus petit,Mais le système doit avoir une bibliothèque dynamique.

  • -O0-3 Options d'optimisation du compilateur4Niveaux,-O0Indique qu'il n'y a pas d'optimisation,-O1Par défaut,-O3Niveau d'optimisation le plus élevé

  • -w Aucun avertissement généré.

  • -Wall Générer tous les avertissements.


Compiler les liens:

  • Prétraitement Les fonctions comprennent principalement le remplacement de macro ,Le fichier contient,Compilation conditionnelle,Pour annoter, etc..
  • Compiler(Générer un assemblage):À ce stade,,gcc Il faut d'abord vérifier la normalisation du Code、S'il y a des erreurs de syntaxe, etc.,Pour déterminer le travail réel à faire pour le Code,Après vérification,gcc Traduire le Code en langage d'assemblage.
  • Compilation(Générer un code d'identification de la machine):La phase d'assemblage génère la phase de compilation“.s”Le document a été converti en“.o”Fichier cible binaire pour
  • Liens:Générer un exécutable ou un fichier de bibliothèque
    Insérer la description de l'image ici

Étapes du lien :

Insérer la description de l'image ici

1.Analyse des symboles
Symboles définis et référencés dans le programme (Inclure le nom de la variable,Nom de la fonction), Conserver dans le tableau des symboles (.symtab). La Table des symboles est un tableau structuré , Contient le nom du symbole 、 Informations telles que la longueur et l'emplacement . Le compilateur stocke la référence du symbole dans la section repositionnement (.rel.textEt.rel.data). Le Linker associe une référence à chaque symbole à une définition de symbole déterminée .

2.Repositionnement
Fusion de plusieurs segments de code et de données en un seul segment de code et de données , Calculer l'adresse absolue de chaque symbole défini dans l'espace d'adresse virtuel . .Modifier la référence du symbole dans l'exécutable pour déplacer les informations d'adresse .

Insérer la description de l'image ici


file、ldd

  • Adoptionfile Fichier exécutableEtldd Fichier exécutable, Vous pouvez voir comment les fichiers sont liés et les bibliothèques de liens dynamiques .
  • Linux Il y a des liens dynamiques sous le système d'exploitation .
    Insérer la description de l'image ici

Liens dynamiques vs Liens statiques


Bibliothèque de fonctions:

  • La nôtre.CEn cours de programmation,Il n'y a pas de définition“printf”Mise en œuvre de la fonction,Et inclus dans le précompilé“stdio.h”Seule la Déclaration de cette fonction,Sans définir l'implémentation de la fonction,Alors,Où est - ce que“printf”Et la fonction?
  • La dernière réponse est:Le système fait toutes ces implémentations de fonctions appelées libc.so.6 Dans le fichier de la Bibliothèque de,En l'absence de désignation spéciale,gcc Va au chemin de recherche par défaut du système“/usr/lib”Trouvez ci - dessous,C'est - à - dire un lien vers libc.so.6 Dans la fonction bibliothèque,Cela permet d'implémenter la fonction“printf”C'est,Et c'est ce que font les liens.

  • Une bibliothèque statique se réfère à la compilation d'un lien,Ajouter tout le Code du fichier de la bibliothèque à l'exécutable,Le fichier généré est donc plus grand,Mais les fichiers de la bibliothèque ne sont plus nécessaires au moment de l'exécution.Son suffixe est généralement appelé“.a”
  • La Bibliothèque dynamique est l'inverse,Le Code du fichier de la Bibliothèque n'a pas été ajouté à l'exécutable lors de la compilation du lien,Au lieu de cela, la bibliothèque est chargée par un fichier lié à l'exécution au moment de l'exécution du programme,Cela permet d'économiser les frais généraux du système.
    • Les bibliothèques dynamiques ont généralement un suffixe nommé“.so”,Comme indiqué précédemment libc.so.6 C'est une bibliothèque dynamique..gcc La Bibliothèque dynamique est utilisée par défaut au moment de la compilation.Une fois le lien terminé,gcc Pour générer un exécutable,

  • Les liens statiques génèrent des fichiers qui peuvent fonctionner indépendamment , Mais la taille est presque dynamique 10X,Volume excessif.
  • La liaison dynamique doit être rechargée au moment de l'exécution ,Économiser la mémoire, Compilation efficace , Mais si une bibliothèque manque ,Le programme s'arrête.
    Insérer la description de l'image ici

Article de référence


  • Pourquoi ne pas traduire directement les langues avancées en binaires ?,, Parce que la langue de haut niveau vient après , Et faire le travail de conversion pertinent à nouveau ,C'est long et laborieux.;Alors, d'abord, Il est facile de convertir en assemblage . C'est ce qu'on appelle se tenir sur les épaules des prédécesseurs ;S'il y a quelque chosebug, Ça s'appelle l'histoire Questions laissées en suspens.
Copyright:Cet article est[Kevlavik]Établi,Veuillez apporter le lien original pour réimprimer,remercier。 https://fra.fheadline.com/2022/204/202207231002354313.html