Procédé pour la réduction de la taille d'un fichier exécutable
Je suis à la production d'un fichier hex pour s'exécuter sur un processeur ARM qui je veux garder en dessous de 32 KO. Il est actuellement beaucoup plus que cela et je me demandais si quelqu'un pourrait avoir quelques conseils sur la meilleure approche pour amincir vers le bas?
Voici ce que j'ai fait jusqu'à présent
- J'ai donc lancer "taille" à déterminer la taille du fichier hex est.
- Puis "taille" à nouveau pour voir la taille de chacun des fichiers objets sont le lien pour créer les fichiers hex. Il semble que la majorité de la taille vient de bibliothèques externes.
- Puis j'ai utilisé "readelf' pour voir les fonctions qui prennent le plus de mémoire.
- J'ai cherché dans le code pour voir si je pouvais éliminer les appels à ces fonctions.
Voici où j'ai coincé, il y a des fonctions que je n'appelez pas directement (par exemple, _vfprintf) et je ne trouve pas ce que les appels afin que je puisse supprimer l'appel (comme je pense que je n'en ai pas besoin).
Alors, quelles sont les prochaines étapes?
Réponse à des réponses:
- Que je peux voir, il y a des fonctions d'être appelé, ce qui prend beaucoup de mémoire. Je ne peux cependant trouver ce qui est de l'appeler.
- Je veux oublier ces fonctions (si possible) mais je ne peux pas trouver ce qui est de les appeler! Pourrait être appelée à partir de n'importe quel nombre de fonctions de la bibliothèque, je suppose.
- L'éditeur de liens de travail comme vous le souhaitez, je pense, elle ne comprend que la bibliothèque en question des fichiers. Comment savez-vous si seulement les fonctions sont incluses? Pouvez-vous définir un indicateur ou quelque chose pour ça?
- Je suis en utilisant GCC
- peut-être que vous savez ce que c'est déjà, peut-être que c'est de l'aider: muppetlabs.com/~breadbox/software/tiny/teensy.html
InformationsquelleAutor Richard | 2008-10-14
Vous devez vous connecter pour publier un commentaire.
Liste générale:
strip
sur l'exécutable-M
lors de l'utilisation de ld), ou vous pouvez utiliser objdump sur l'exécutable final (notez que cela ne fonctionne que sur un remontées exécutable!) Cela ne fait pas de résoudre le problème, mais il vous permettra de connaître les pires délinquants.nm
pour enquêter sur les symboles qui sont appelés de chacun de vos fichiers de l'objet. Cela devrait vous aider à trouver qui est l'appel de fonctions que vous ne voulez pas appelé.Dans la question d'origine était une sous-question sur le fait d'inclure uniquement les fonctions pertinentes.
gcc
comprendra toutes les fonctions à l'intérieur de chaque fichier objet qui est utilisé. En d'autres termes, si vous avez un objet de fichier qui contient 10 fonctions, tous les 10 fonctions incluses dans votre exécutable, même si un 1 est en fait appelé.Les bibliothèques standard (par exemple. libc) vont partager les fonctions dans un grand nombre de fichiers de l'objet, qui sont ensuite archivés. L'exécutable est alors lié à l'encontre de l'archive.
En se divisant en plusieurs fichiers objets de l'éditeur de liens est en mesure d'inclure uniquement les fonctions que l'on appelle en fait. (cela suppose que vous êtes la liaison statique)
Il n'ya aucune raison pourquoi vous ne pouvez pas faire le même truc. Bien sûr, vous pourriez faire valoir que si les fonctions ne sont pas appelés à la vous pouvez probablement les supprimer vous-même.
Si vous êtes à la liaison statique contre d'autres bibliothèques, vous pouvez exécuter les outils énumérés ci-dessus sur eux trop pour s'assurer qu'ils suivent des règles similaires.
Une autre optimisation qui pourrait vous faire économiser de travail est -ffunction-sections, -Wl,--gc-sections, en supposant que vous êtes en utilisant GCC. Un bon ensemble d'outils n'auront pas besoin d'être dit que, bien que.
Explication: GNU ld liens sections, et GCC émet une section par unité de traduction, à moins que vous décidiez de les. Mais en C++, les nœuds dans le graphe de dépendance au sont des objets et des fonctions.
Juste à double-vérifier et de document de référence pour l'avenir, mais ce que vous utilisez le Pouce instructions? Ils sont 16 bits de la normale instructions. Parfois, vous pourriez avoir besoin de 2 16 bits instructions, de sorte qu'il ne sera pas économiser 50% en l'espace de codage.
Un décent de l'éditeur de liens doit prendre juste les fonctions nécessaires. Cependant, vous pourriez avoir besoin de compilateur & linke paramètres pour les fonctions de package pour chaque liaison.
Sur profondément ancrée projets que j'ai toujours essayer d'éviter d'utiliser toutes les fonctions de bibliothèque standard. Même les fonctions simples comme "strtol()" exploser la taille du binaire. Si possible, simplement, d'éviter ces appels.
Profondément ancrée dans la plupart des projets que vous n'avez pas besoin d'un polyvalent "printf()" ou de l'allocation dynamique de la mémoire (de nombreux contrôleurs de 32 ko ou moins de RAM).
Au lieu de simplement en utilisant "printf()" j'utilise un très simple et personnalisé "printf()", cette fonction ne peut écrire les nombres en hexadécimal ou décimal format non plus. La plupart des structures de données sont préaffectés au moment de la compilation.
Ok donc au final j'ai juste réduit le projet à sa forme la plus simple, puis, lentement, les fichiers ajoutés un par un jusqu'à ce que la fonction que j'ai voulu supprimer parus dans les readelf fichier. Puis, quand j'ai eu le fichier que j'ai commenté tout et ajouter lentement les choses jusqu'à ce que la fonction surgit de nouveau. Donc au final j'ai trouvé ce qui l'a appelé et a enlevé tous ces appels...Maintenant il fonctionne comme on le souhaite...sucré!
Doit y avoir une meilleure façon de le faire bien.
Andrew Edgecomb a une grande liste, mais si vous voulez vraiment gratter chaque dernier octet, sstrip est un bon outil qui est absent de la liste et peut raser un peu plus de kB.
Par exemple, lorsqu'il est exécuté sur
strip
lui-même, il peut raser ~2kB.À partir d'un vieux fichier README (lisez les commentaires en haut de cette indirects fichier source):
Noter qu'en raison de certaines des informations qu'il supprime, un sstrip avais exécutable est la rumeur dit qu'questions avec certains outils. Cette question est examinée plus dans les commentaires de la source.
Aussi... pour un divertissant/fou de lire sur la façon de faire la plus petite possible exécutable, cet article est intéressant à lire.
Pour répondre à ce besoin spécifique:
Si vous souhaitez analyser votre base de code pour voir qui appelle à ce que, par lequel une fonction est appelée, et des choses comme ça, il est un excellent outil appelé "Comprendre C" fourni par SciTools.
https://scitools.com/
Je l'ai utilisé très souvent dans le passé pour effectuer l'analyse statique de code. Il peut vraiment aider à déterminer la bibliothèque de l'arbre des dépendances. Il permet de parcourir facilement en haut et en bas de l'arborescence appelant entre autres choses.
Ils offrent une durée limitée évaluation, alors vous devez acheter une licence.
Vous pourrait ressembler à quelque chose comme compression du fichier exécutable.