2 votes

comment le système d'exploitation et le compilateur communiquent pour lancer la compilation d'un programme

Quand je donne la commande pour compiler un .cpp code comme

g++ abc.cpp

Est-ce que j'appelle un systemcall pour lancer d'abord l'application gcc et lui fournir le fichier (abc.cpp) à compiler.

sinon, comment la fonction void _start() du compilateur est appelée, ce qui permet d'appeler main() fonction.

Est-ce que c'est comme si le system() de l'OS était appelé et qu'il appelait le void _start()

1voto

Gill Bates Points 3884

g++ est juste un alias pour somewhere/bin/g++ qui est un exécutable. Cet exécutable est transmis abc.cpp en tant qu'arguments, puis fait ce qu'un compilateur fait pour compiler le fichier. Il peut utiliser d'autres exécutables pour compiler et lier le fichier sous le capot.

La seule chose que fait le système d'exploitation est de charger g++ en mémoire et appelle son main à travers le crt.

0voto

Eric Postpischil Points 36641

Lorsque vous tapez des commandes, vous utilisez un programme appelé shell de ligne de commande. Il s'agit d'un programme qui lit les entrées, analyse le texte qu'il reçoit et exécute les commandes contenues dans le texte.

Para g++ abc.cpp la coquille regarde vers le haut g++ et trouve qu'il s'agit du nom d'un fichier exécutable (soit directement, soit parce que c'est un lien vers un fichier réel). Il exécute ensuite ce fichier. C'est un processus assez compliqué qui inclut la création d'un processus enfant qui charge le fichier exécutable en mémoire et l'exécute ensuite. (Note : Certains fichiers exécutables sont des shell scripts plutôt que des exécutables binaires contenant des instructions machine. Les scripts sont exécutés en chargeant le programme shell et en lui disant d'exécuter le scripts).

El g++ Le programme analyse ensuite les arguments qui lui ont été donnés. Dans le cas de g++ abc.cpp il ouvrira "abc.cpp" et le compilera. g++ est un programme comme n'importe quel programme que vous pouvez écrire : Il lit des fichiers, effectue des calculs et écrit des fichiers.

g++ peut être un exécutable unique qui fait beaucoup de choses, mais il effectue probablement une grande partie de son travail en créant des sous-processus supplémentaires pour exécuter d'autres programmes. Il peut y avoir un programme distinct pour effectuer la compilation du code et un autre pour lier le code à un exécutable. (Il peut également y avoir des programmes séparés pour le prétraitement et l'optimisation, ainsi que pour la compilation du code dans un langage intermédiaire, puis pour la génération du langage d'assemblage, puis pour l'assemblage du langage d'assemblage, mais ceux-ci peuvent également être intégrés dans un seul programme).

Il y a de nombreuses interactions avec le système dans ce processus. L'ouverture de fichiers, leur lecture et leur écriture nécessitent des appels système. Votre question semble essentiellement porter sur l'exécution de programmes.

En gros, sur Unix et les systèmes similaires, les étapes impliquées dans un programme provoquant l'exécution d'un autre sont les suivantes :

  • Le programme appelle fork . Il s'agit d'un appel système qui crée un double du processus. Lorsque cela est fait, il y a deux copies du même processus. L'une est appelée le parent et l'autre l'enfant. Le système indique à chaque processus s'il est le parent ou l'enfant par une valeur de retour de la fonction fork appeler.
  • Le programme examine les fork pour voir s'il s'agit du parent ou de l'enfant. S'il s'agit de l'enfant, il appelle une routine dans le fichier exec famille pour exécuter un autre programme.
  • El exec ouvre le fichier contenant le programme à exécuter et le lit en mémoire. Il s'agit d'interpréter le contenu du fichier exécutable, car ce dernier n'est pas seulement des données brutes. Il contient une variété de structures qui décrivent différentes choses à mettre en mémoire lors de la préparation de l'exécution du programme.
  • Une grande partie du travail de l exec L'appel peut se faire de manière ordinaire : Ouvrir un fichier, lire son contenu, analyser son contenu et organiser les choses en mémoire. De plus, les fichiers exécutables peuvent utiliser des bibliothèques partagées, et leur chargement nécessitera l'ouverture d'autres fichiers et leur chargement. Cependant, le exec sera assisté dans une certaine mesure par des appels système qui modifient les mappages de mémoire pour le processus et effectuent d'autres tâches.
  • Finalement, lorsque le programme à exécuter est suffisamment chargé en mémoire, le logiciel qui le charge transfère le contrôle à son adresse de départ, et le processus exécute alors le nouveau programme.

(J'ai sans doute fait peu de cas de la exec et les processus de chargement, et éventuellement d'autres questions abordées ci-dessus).

0voto

user3344003 Points 3070

Cela fonctionne différemment selon les systèmes d'exploitation, mais vous avez posé une question spécifique sur les eunuques.

Dans les variantes d'Unix, les utilisateurs interagissent avec un shell. (Contrairement à ce qui se passe sur de nombreux systèmes) l'interpréteur de commandes est juste un programme sans qualités particulières. Vous pouvez écrire votre propre interpréteur de commandes simple, l'exécuter et le laisser être votre interface avec le système.

Lorsque vous tapez quelque chose dans un shell standard, tel que

$ XYZ

le shell doit déterminer ce qu'est XYZ.

  1. Il peut s'agir d'un alias qui doit être développé dans une autre commande.

  2. Il peut s'agir d'une commande que le shell exécute en interne. Les paramètres de l'interpréteur de commandes et les commandes comme "cd" sont généralement exécutés par l'interpréteur de commandes.

  3. Si XYZ n'est pas l'un de ces fichiers, l'interpréteur de commandes essaie généralement de trouver un fichier nommé XYZ. Cela se fait généralement en cherchant dans les répertoires spécifiés dans la variable PATH.

  4. En supposant que l'interpréteur de commandes puisse trouver XYZ, il déterminera généralement si XYZ est un fichier script contenant une liste de commandes à traiter. Le traitement des script est généralement la partie la plus complexe d'un programme shell. Pour chaque commande. Le script contiendra généralement un mélange d'instructions de contrôle (par exemple, if) et de commandes. Pour chaque commande que le script identifie, il doit revenir à l'étape 1 et la traiter.

  5. Si XYZ est un fichier exécutable, le shell doit l'exécuter. Dans Unix, le shell crée un nouveau processus en utilisant les services système fork et exec-type.

Votre XYZ est g++. Dans votre exemple, vous avez un paramètre abc.cpp. Historiquement, les shells Unix n'ont pas de véritable analyse de la ligne de commande. Ils décomposent simplement la chaîne de commande en nom de fichier et en paramètres. Le programme est chargé de donner un sens aux paramètres.

La famille des services système exec utilisés pour exécuter un programme permet de spécifier des paramètres à passer au programme :

Si vous l'avez fait

   g++ -xi132m asdfadf 345211 afara

le shell invoquerait typiquement le programme exécutable g++ et lui passerait quatre chaînes absurdes. g++ les trouverait comme paramètres arvc et argv de main. g++ signalerait probablement une erreur et sortirait. Dans votre cas, g++ n'a trouvé qu'un seul paramètre, la chaîne "abc.cpp".

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