11
votes

Pourquoi ce programme trivial est-il si grand lorsqu'il est compilé?

J'ai créé un fichier contenant la ligne suivante:

g++ main.cpp


9 commentaires

De quelle plate-forme compilez-vous? C'est à dire. Windows, Linux?


MuppetLabs.com/~breadbox/software/TILY/TEENSY.HTMLLe


@Matthew je suis sur Linux. Ubuntu 64 bits, spécifiquement.


@ikh et Daniel A. White - J'ai mis à jour la question, espérons que cela répond à vos questions.


"Ce programme peut sûrement être exprimé en quelques lignes de montage." - Tu as oublié Cr0.o Stuff ...


@Griwes, Nah, je suis juste ignorant de Cr0.o Stuff. Soin de me éclairer?


@Coryklein, c'est ce que Larsmans appelé "code de démarrage".


Vous appelez 8K gros? Bonjour le monde est de 500k sur Mingw;)


Je sais que je suis une semaine tardive vers le match, mais cette question m'a rappelé une question de dépassement de pile similaire (bien qu'une perspective Windows) what-is-the-windows-Windows-PE-exécutable qui pointe sur cet article: Tiny PE qui revendique 97 octets comme la plus petite PE possible mais attendez. Cet article a été inspiré d'un article précédent à base de Linux sur de petits fichiers: [ Un tutoriel tourbillonnant sur la création de Vray Teensy Elf Executables pour Linux] ( Mapp


3 Réponses :


29
votes

Il y a beaucoup dans ce binaire:

  • un en-tête pour rendre l'auto-décrivant binaire (essayez d'exécuter fichier dessus)
  • une table de symboles, que l'outil supprimera pour vous (ou un lien avec gcc -s -s )
  • Les noms et les emplacements des bibliothèques partagées que vous n'utilisez jamais (cinq d'entre eux sur ma boîte; essayez le ldd et strings outils)
  • code de démarrage qui charge ces bibliothèques et définit argc et argv , puis appelle principal
  • Code d'arrêt qui renvoie la valeur de retour S principal sur le système d'exploitation.

    Pour effet de bande dessinée, essayez de relier ce programme statiquement, où votre binaire comprendra les fonctions qui seraient normalement liées dynamiquement aux DLL. (Cependant, cette option simplifiera le déploiement)


0 commentaires

3
votes

faire une vidage binaire du fichier résultant et vérifier!

C'est surtout de l'espace vide. Les données dans le binaire sont organisées en pages (généralement de 4096 ou 8192 octets de taille). C'est ainsi que les pages peuvent être Mémoire mappée efficacement. Typiquement, la première page contient des instructions sur la manière de charger le code binaire est à cette position dans le fichier et est mappée sur cet emplacement, identique pour les données, etc. La deuxième page sera probablement votre code, et la troisième page contiendra des symboles et des informations de débogage. Chaque page est probablement principalement vide.


1 commentaires

Hmm, très intéressant. Je l'ai examiné avec un éditeur hexagonal et il y a une section vide, mais elle ne consiste en 46% du fichier.



2
votes

Ne vous inquiétez pas.

Essayez de créer un programme moins trivial et vous découvrirez la taille n'est pas si différente, jusqu'à ce que votre code commence à devenir divers centaines de kilo-octets.

brièvement: Il ya une partie de la bibliothèque standard qui constitue "l'infrastructure" entre les modules OS et la sémantique C ++ gérant le démarrage et la résiliation du programme (tout ce qui initialise et détruisent le monde. Variables, l'entrée et la sortie standard, etc.)

plus: Tout ce qui correspond aux symboles C ++ vers les adresses de mémoire (si vous n'avez pas besoin de le supprimer - essayez le -O3 -s et éliminer les options -g ) afin qu'un débogueur puisse afficher les références de code source appropriées sur l'exécution.

aussi: en raison de la manière dont la mémoire est aménagée, un binaire est normalement composé de morceau de taille fixe. Votre programme peut même être plus court, mais au moins un segment de code, un initialiseur de segment de données et un segment partagé (pour des valeurs constantes) doivent être présents.


0 commentaires