2010-12-15 49 views
4

Je souhaite supprimer le code mort d'un projet volumineux et souhaiter commencer par les symboles inutilisés. Y at-il de toute façon que l'éditeur de liens lise les symboles inutilisés qu'il a optimisés? J'utilise le linker GNU (LD) avec GCC.Liste des symboles inutilisés

A défaut, l'un des Binutils (readelf ou objdump) peut-il effectuer la même fonction?

+0

duplication possible de [Recherche de "code mort" dans une grande application héritée C++] (http://stackoverflow.com/questions/2380153/finding-dead-code-in-a-large-c-legacy-application) – icecrime

+0

Cette question est spécifique au Binutils – doron

+1

duplicata possible de [Y at-il un moyen d'obtenir gcc de prévenir des fonctions inutilisées?] (Http://stackoverflow.com/questions/9091397/is-there-a-way-to- get-gcc-to-warn-about-unused-functions) –

Répondre

6

La plupart des compilateurs/lieurs optimisent les symboles inutilisés. Si vous utilisez un système * nix, vous pouvez essayer d'utiliser la commande "nm" sur tous les fichiers objets, les filtrer et les trier, pour produire une liste de toutes les fonctions exportées définies par ces fichiers objets.

nm *.o | grep "^[0-9a-f]* T " | sed 's/^[0-9a-f]* T //' | sort -u > symbols_in.txt 

Je crois que vous pouvez faire de même sur les binaires finaux.

Si vous différez ensuite les deux ensembles de résultats, vous devriez obtenir une liste de toutes les fonctions exportées inutilisées.

Attention, cependant, certaines fonctions peuvent être utilisées par du code exclu suite à une compilation conditionnelle. Par exemple. un commutateur #ifdef pour dire que sur la plate-forme A, utilisez telle ou telle fonctionnalité intégrée et sur une autre plate-forme, utilisez votre propre version de la fonction car il n'y a pas de bibliothèque intégrée ou standard équivalente, ou cela ne fonctionne pas correctement.

+0

J'ai essayé quelque chose comme cette approche en premier, mais j'ai eu des problèmes car les symboles déclarés dans un module et * seulement * appelés à partir de ce module (et non déclarés 'static') ont l'air d'être inutilisés. De même, par défaut, gcc n'effectue pas de liaison de niveau fonction, de sorte que les fonctions inutilisées dans un module à côté des fonctions utilisées ne sont pas éliminées. Cette question a une bien meilleure solution: [Existe-t-il un moyen d'avertir gcc des fonctions inutilisées?] (Http://stackoverflow.com/questions/9091397/is-there-a-way-to-get-gcc- to-warn-about-unused-fonctions) –

4

GCC peut générer un avertissement de compilateur lorsqu'il rencontre des fonctions, des étiquettes et des paramètres de fonction inutilisés. Les indicateurs du compilateur -Wunused -Wunused-parameter le feront.

Je recommande personnellement d'activer tous les avertissements et les avertissements supplémentaires en cours de développement. Les drapeaux sont -Wall -Wextra et les avertissements de code mort sont impliqués par ces drapeaux, ainsi que toute une série d'autres avertissements que j'ai trouvés utiles.

+5

Cela n'aide qu'avec les symboles non-relocables. Si le symbole est relocalisable, il faut attendre que l'éditeur de liens décide si le symbole est nécessaire ou non, donc le compilateur ne pourra pas aider ici. – doron