Tout exercice pratique pour comprendre comment un programme est chargé en mémoire et exécuté

StackOverflow https://stackoverflow.com/questions/1210522

  •  06-07-2019
  •  | 
  •  

Question

Je suis curieux de savoir ce qui s’est passé avant l’appel de main (), tel que le chargement de l’exécutable en mémoire, le chargement dynamique d’une bibliothèque partagée. Avez-vous des suggestions pour comprendre ces choses par un exercice pratique?

Les outils que je connais et que j'utilise actuellement sont les suivants:

  • strace
  • démonter
  • readelf
  • / proc / pid / map

NOTES: Je connais l'excellent livre des éditeurs de liens et des chargeurs , mais sur l'exercice peut m'apprendre mieux que de lire le livre.

Était-ce utile?

La solution

  • Le ld.so page de manuel plusieurs variables d’environnement pouvant être définies pour modifier le processus de liaison dynamique ou fournir des détails supplémentaires.

par exemple.

LD_DEBUG=all cat </dev/null
  • Vous pouvez facilement obtenir le code source de chaque élément impliqué - noyau Linux, éditeur de liens dynamique, bibliothèque C, code de démarrage (crt0.o ou similaire). Vous pouvez commencer par étudier le code et faire des modifications expérimentales.

Autres conseils

Si vous voulez vérifier comment un fichier binaire est compressé et ses différentes sections, le meilleur programme qui existe est objdump .

Choisissez quel que soit l'exécutable et faites:


objdump -S <executable>  > myfile.S

Un autre bon exercice sera:

  • Crée un programme utilisant une bibliothèque externe
  • Compilez le programme en utilisant des liens statiques
  • Exécuter le programme
  • Renommez le fichier de bibliothèque et vérifiez si le programme est exécuté
  • Compilez le programme en utilisant la bibliothèque partagée
  • Renommez la bibliothèque et vérifiez si le programme fonctionne

Cela répondra à certaines de vos questions sur ce qui se passe sous les rideaux et comment.

J'ai trouvé deux liens connexes intéressants (au moins pour Linux) et un peu plus courts que le livre mentionné (Linkers and Loaders)

Lorsque j'ai suivi un cours sur l'OS au collège, nous utilisions les Nachos . . Ce n'est pas un système d'exploitation en soi , mais une sorte de "système d'exploitation" simulant " qui s'exécute dans l'espace utilisateur. Il est écrit en C ++ et vous pouvez compiler des exécutables que Nachos peut ensuite charger et exécuter. Vous pouvez jouer avec l'interface d'appel système et expérimenter en général autant que vous le souhaitez en jouant avec le code.

Nous l'avons utilisé dans un laboratoire Solaris et j'ai eu quelques difficultés à le faire fonctionner sous Linux sur ma machine personnelle, mais il peut s'agir d'un jouet amusant si vous êtes prêt à fouiller dans un code.

Je réalise que c’est probablement beaucoup pour ce que vous recherchez, mais écrire votre propre assembleur et votre éditeur de lien serait très instructif. Je l'ai fait quand j'étais au collège et j'ai adoré. Il me fallut peut-être 120 heures de travail pour que je puisse me concentrer sur les tâches de base que je voulais. Je pense que ce projet plus que tout autre chose m'a assuré qu'une carrière dans la programmation était pour moi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top