Éditeurs de liens, chargeurs et exécutables

En C++, quel est le mécanisme correct par lequel les constructeurs d'objets globaux s'exécutent avant main ?

  1. ALe CPU détecte les constructeurs et les exécute automatiquement en premier
  2. BLe compilateur recopie toujours tous les constructeurs à la première ligne de la fonction main
  3. CLes adresses des fonctions appelant les constructeurs sont regroupées dans une table comme .init_array, et le code de démarrage les appelle successivement avant main
Afficher la réponse et l'explication

Réponse : C. Les adresses des fonctions appelant les constructeurs sont regroupées dans une table comme .init_array, et le code de démarrage les appelle successivement avant main

Le compilateur crée une fonction qui initialise les objets globaux de chaque fichier et place son adresse dans une section spéciale nommée .init_array. L'éditeur de liens regroupe les .init_array de tous les fichiers en une seule table, et le code de démarrage ou l'éditeur de liens dynamique appelle successivement ses fonctions avant main. Inversement, les traitements de fin sont regroupés dans .fini_array. L'ordre d'initialisation entre fichiers n'étant pas défini, il faut veiller à ne pas créer de dépendances.

S'entraîner sur ce thème Retour au thème

Autres questions sur Éditeurs de liens, chargeurs et exécutables

  1. Quelle affirmation concernant le fichier objet (.o) produit par le compilateur à partir d'un fichier source est correcte ?
  2. Quel est le rôle principal de l'éditeur de liens (linker) ?
  3. Quelle description de la résolution des symboles effectuée par l'éditeur de liens est correcte ?
  4. Quelle description de la relocalisation effectuée par l'éditeur de liens est correcte ?
  5. Lors de l'édition de liens d'un programme C, l'erreur « undefined reference to `foo' » (référence non définie à foo) apparaît. Quelle est la cause la plus probable ?

Comparatifs sur ce thème