Est-il possible de dépouiller toutes les fonctions d'un fichier objet que je n'utilise pas?

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

Question

Je suis en train de gagner de la place dans mon exécutable et j'ai remarqué que plusieurs fonctions sont ajoutées dans mes fichiers objet, même si je ne les appelle (le code est d'une bibliothèque).

Y at-il un moyen de dire à gcc pour supprimer ces fonctions automatiquement ou dois-je les supprimer manuellement?

Était-ce utile?

La solution 4

Depuis que je pose cette question, GCC 4.5 a été libéré avec une option de combiner tous les fichiers de sorte qu'il ressemble il est à seulement 1 fichier gigantesque source. En utilisant cette option, il est possible de dépouiller facilement les fonctions inutilisées.

Plus de détails

Autres conseils

Si vous compilez dans des fichiers d'objet (non exécutables), puis un compilateur ne sera jamais supprimer toutes les fonctions non-static, car il est toujours possible que vous lier le fichier objet contre un autre fichier objet qui appelle cette fonction. Donc, votre première étape devrait être déclarer autant de fonctions que possible static.

En second lieu, la seule façon pour un compilateur pour supprimer toutes les fonctions non utilisées serait de lier statiquement votre exécutable. Dans ce cas, il y a au moins la possibilité qu'un programme pourrait venir et déterminer quelles fonctions sont utilisées et celles qui ne sont pas utilisés.

Le hic est, je ne crois pas que gcc ne fait ce type d'optimisation inter-module. Votre meilleur pari est le drapeau de -Os pour optimiser la taille du code, mais même alors, si vous avez un fichier objet abc.o qui a des fonctions inutilisées non statiques et vous établissez un lien statique contre une def.exe exécutable, je ne crois pas que gcc aller dépouiller le code pour les fonctions non utilisées.

Si vous avez vraiment besoin désespérément que ce soit fait, je pense que vous pourriez avoir à #include réellement les fichiers ensemble de sorte que, après le passage de préprocesseur, il en résulte un seul fichier .c compilé. Avec gcc compilation d'un seul fichier monstrueux source jumbo, vous les meilleures chances de fonctions inutilisées étant éliminé.

Avez-vous regardé en appelant gcc avec -OS (optimize pour la taille.) Je ne sais pas si le code bandes non atteint, mais il serait assez simple à tester. Vous pouvez aussi, après avoir obtenu votre dos exécutable, « bande » elle. Je suis sûr qu'il ya un arg gcc ligne de commande pour faire la même chose - est-il --dead_strip

En plus de -Os pour optimiser la taille, ce lien peut être utile.

IIRC l'éditeur de liens par défaut fait ce que vous voulez ins certains cas spécifiques. Le court est que les fichiers de bibliothèque contiennent un tas de fichiers objets et fichiers uniquement référencés sont liés. Si vous pouvez comprendre comment obtenir GCC émette chaque fonction dans le propre fichier objet de, puis construire ce dans une bibliothèque que vous devriez obtenir ce que vous cherchez.

Je ne connais qu'un seul compilateur qui peut réellement faire ceci: ici (regardez le drapeau -Lib)

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