Éditeurs de liens, chargeurs et exécutables

Découvrez les fichiers objets et le format ELF, la résolution des symboles et la relocalisation, l'édition de liens statique et dynamique, ainsi que l'organisation mémoire d'un processus avec des QCM.

S'entraîner sur 10 questionsQuestions aléatoires de ce thème · environ 5 minutes S'entraîner sur ce thèmeToutes les questions de ce thème dans un ordre aléatoire Questions à revoirNe refaire que les questions manquées lors de la dernière tentative

Éditeurs de liens, chargeurs et exécutables : points clés

Un compilateur produit un fichier objet, qui ne peut pas s'exécuter seul. L'éditeur de liens rassemble fichiers objets et bibliothèques, associe les noms de fonctions et de variables (symboles) à des adresses réelles (résolution des symboles), reporte ces adresses dans les instructions (relocalisation) et produit un exécutable.

Le chargeur lit l'exécutable en mémoire, met en place les segments text, data, BSS, le tas et la pile, puis lance le programme. L'édition de liens dynamique, qui lie les bibliothèques à l'exécution, et le code indépendant de la position (PIC), qui s'exécute à n'importe quelle adresse, permettent à la fois d'économiser la mémoire et d'améliorer la sécurité.

Toutes les questions sur Éditeurs de liens, chargeurs et exécutables (50)

  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 ?
  6. La même fonction globale void init(void), sans static, est définie à la fois dans a.c et b.c, puis on effectue l'édition de liens. Que se passe-t-il ?
  7. Quel est l'effet de la définition d'une fonction avec static en C (par exemple static int helper(void)) ?
  8. Que signifie l'écriture « extern int count; » en C ?
  9. Quelle affirmation concernant les fichiers au format ELF, courant sous Linux notamment, est correcte ?
  10. Que contient la section .text d'un exécutable ?
  11. Dans quelle section est généralement placée une variable globale écrite hors de toute fonction en C sous la forme « int limit = 100; » ?
  12. Quelle caractéristique de la section .bss est correcte ?
  13. L'exécution de « char *p = "hello"; p[0] = 'H'; » en C provoque une terminaison anormale dans de nombreux environnements. Quelle en est la raison ?
  14. Parmi les variables globales ci-dessus, quelle combinaison correspond à celles généralement placées dans la section .bss ?
  15. Où est placée pendant l'exécution une variable locale (variable automatique) sans static déclarée dans une fonction C ?
  16. De quelle zone du processus provient généralement la mémoire allouée par malloc en C ?
  17. Quel est l'agencement mémoire correct d'un processus typique sous Linux notamment, des adresses basses aux adresses hautes ?
  18. Quel est l'avantage de l'agencement qui fait croître le tas et la pile d'un processus en sens opposés, avec un vaste espace libre entre eux ?
  19. Quelle description de l'édition de liens statique est correcte ?
  20. Quel est l'avantage de l'édition de liens dynamique (bibliothèques partagées) ?
  21. Un programme utilisant l'édition de liens dynamique, copié sur un autre ordinateur, ne démarre pas. Quelle est la cause la plus probable ?
  22. Lors de l'édition de liens avec une bibliothèque statique (fichier .a), qu'est-ce que l'éditeur de liens intègre dans l'exécutable ?
  23. Avec l'éditeur de liens GNU, écrire une bibliothèque statique avant le fichier objet qui l'utilise, comme « gcc -lmylib main.o », peut provoquer une erreur de référence non définie. Quelle en est la raison ?
  24. Quelle description du code indépendant de la position (PIC) est correcte ?
  25. Quel est le rôle de la GOT (table globale des déplacements) utilisée dans les bibliothèques partagées ?
  26. En édition de liens dynamique, quelle description de la liaison différée (lazy binding) utilisant la PLT (table de liaison des procédures) est correcte ?
  27. Quel est le rôle de l'éditeur de liens dynamique (ld.so, etc.) qui intervient au démarrage d'un programme à liens dynamiques sous Linux ?
  28. Quel est l'objectif de l'ASLR (randomisation de l'agencement de l'espace d'adressage) ?
  29. Quelle est la principale raison de produire un exécutable sous forme de PIE (exécutable indépendant de la position) ?
  30. Que fait le chargeur de l'OS au démarrage d'un programme (execve sous Linux notamment) ?
  31. Quelle affirmation concernant l'adresse où l'OS commence l'exécution d'un programme C (point d'entrée) est correcte ?
  32. Lorsque la fonction main d'un programme C se termine par « return 3; », que devient généralement cette valeur 3 ?
  33. Que se passe-t-il lorsqu'on applique la commande strip à un exécutable ?
  34. Quel est le traitement correct d'un symbole faible (weak symbol) par l'éditeur de liens ?
  35. Quel est le principal objectif de la décoration de noms (mangling), par laquelle le compilateur C++ ajoute au nom d'une fonction des informations comme le type de ses arguments pour former le nom de symbole ?
  36. Quel est l'usage le plus approprié de la fonction dlopen de Linux (équivalent de LoadLibrary sous Windows) ?
  37. Lorsque 100 processus utilisent la même bibliothèque partagée, quelle est l'utilisation correcte de la mémoire physique ?
  38. En désassemblant un fichier objet, on constate que la destination de l'instruction appelant la fonction externe printf a une valeur provisoire comme 0. Quand cette valeur est-elle correctement renseignée ?
  39. Quel est le rôle d'un script d'édition de liens (linker script) utilisé en développement embarqué ?
  40. Sur un microcontrôleur sans OS, quel traitement le code de démarrage effectue-t-il juste après la mise sous tension, avant d'appeler main ?
  41. Quelle est la différence correcte entre « section » et « segment » dans un fichier ELF ?
  42. Quelle attaque est plus facile à prévenir en n'autorisant jamais simultanément « inscriptible » et « exécutable » sur une page mémoire (W^X, séparation écriture-exécution) ?
  43. Sous Linux, dans quel cas incrémente-t-on généralement le numéro de version du soname, comme le « .1 » de libfoo.so.1 ?
  44. Que permet de savoir la commande ldd appliquée à un exécutable sous Linux ?
  45. Quelle combinaison des formats d'exécutables utilisés par les principaux OS est correcte ?
  46. Lorsqu'une récursion trop profonde dépasse la limite de la pile, que se passe-t-il généralement sous Linux notamment ?
  47. En C, quelle affirmation concernant la valeur initiale d'une variable locale et d'une variable globale déclarées sans valeur initiale est correcte ?
  48. À force de répéter malloc et free, il peut devenir impossible d'allouer un grand bloc d'un seul tenant alors que la mémoire libre totale est suffisante. Comment appelle-t-on ce phénomène ?
  49. Lors de la création d'une bibliothèque partagée, quel est l'avantage de n'exporter que les fonctions utilisées de l'extérieur et de régler la visibilité des symboles des fonctions internes sur « hidden » ?
  50. En C++, quel est le mécanisme correct par lequel les constructeurs d'objets globaux s'exécutent avant main ?

Comparatifs sur ce thème

Autres thèmes de Systèmes informatiques