J'ai besoin d'optimiser la taille de mon exécutable sévèrement ( ARM
développement) et J'ai remarqué que dans mon schéma de construction actuel ( gcc
+ ld
) les symboles inutilisés ne sont pas supprimés.
L'utilisation de la arm-strip --strip-unneeded
pour les exécutables / bibliothèques résultants ne change pas la taille de sortie de l'exécutable (Je ne sais pas pourquoi, peut-être qu'il ne peut tout simplement pas). .
Quelle serait la façon (s'il existe) de modifier mon pipeline de construction, de sorte que les symboles inutilisés soient supprimés du fichier résultant ?
Je n'y penserais même pas, mais mon environnement embarqué actuel n'est pas très "puissant" et l'économie d'énergie, même si elle n'est pas très importante, n'en est qu'à ses débuts. l'économie même 500K
de 2M
se traduit par un gain de performances de chargement très appréciable.
Mise à jour :
Malheureusement, l'actuel gcc
que j'utilise n'a pas l'option -dead-strip
et l'option -ffunction-sections... + --gc-sections
pour ld
ne donne pas de différence significative pour la sortie résultante.
Je suis choqué que cela soit devenu un problème, parce que j'étais sûr que gcc + ld
devrait automatiquement supprimer les symboles inutilisés (pourquoi doivent-ils les conserver ?).
0 votes
Comment savez-vous que les symboles ne sont pas utilisés ?
2 votes
N'est référencé nulle part => n'est pas utilisé dans l'application finale. Je suppose que la construction du graphe d'appel pendant le couplage/la liaison ne devrait pas être très difficile.
1 votes
Essayez-vous de réduire la taille du fichier .o en supprimant les morts ? symboles ou vous essayez de réduire la taille de l'empreinte réelle du code une fois chargé dans la mémoire exécutable ? Le fait que vous disiez "embarqué" laisse entendre la seconde hypothèse ; la question que vous posez semble axée sur la première.
0 votes
@Ira J'essaie de réduire la taille de l'exécutable de sortie, car (à titre d'exemple) si je tente de porter certaines applications existantes, qui utilisent
boost
les bibliothèques, le résultat.exe
contient de nombreux fichiers d'objets inutilisés et, en raison des spécifications de mon moteur d'exécution embarqué actuel, le lancement d'un fichier de type10mb
prend beaucoup plus de temps que, par exemple, le démarrage d'une500k
application.9 votes
@Yippie : Vous voulez vous débarrasser de code pour minimiser le temps de chargement ; le code dont vous voulez vous débarrasser sont les méthodes inutilisées/etc. des bibliothèques. Oui, vous devez construire un graphe d'appel pour faire cela. Ce n'est pas si simple ; il doit s'agir d'un graphe d'appel global, il doit être conservateur (il ne peut pas supprimer quelque chose qui pourrait être utilisé) et il doit être précis (afin de se rapprocher le plus possible d'un graphe d'appel idéal, de sorte que vous sachiez vraiment ce qui n'est pas utilisé). Le gros problème est de faire un graphe d'appel global et précis. Je ne connais pas beaucoup de compilateurs qui le font, sans parler des linkers.
0 votes
Oui, mais comment savez-vous qu'ils ne sont référencés nulle part ?
0 votes
Quelle version de gcc/ld utilisez-vous ?
0 votes
Si vous mettez à jour votre chaîne d'outils (ce qui devrait être assez simple, n'ayez crainte), les conseils de Nemos commenceront peut-être à fonctionner ?