web-dev-qa-db-fra.com

Quelle est la différence entre "gcc -s" et une commande "strip"?

Je me demande quelle est la différence entre ces deux:

  • gcc -s: Supprimez toutes les informations de table de symboles et de relocalisation de l'exécutable.

  • strip: Supprimer les symboles des fichiers objets.

Ont-ils la même signification?

Lequel utilisez-vous pour:

  • réduire la taille de l'exécutable?
  • accélérer son fonctionnement?
65
Tim

gcc étant un compilateur/éditeur de liens, son -s L'option est quelque chose de fait lors de la liaison. Il n'est pas non plus configurable - il dispose d'un ensemble d'informations qu'il supprime, ni plus ni moins.

strip est quelque chose qui peut être exécuté sur un fichier objet déjà compilé. Il dispose également d'une variété d'options de ligne de commande que vous pouvez utiliser pour configurer les informations à supprimer. Par exemple, -g supprime uniquement les informations de débogage qui gcc -g ajoute.

Notez que strip n'est pas une commande bash, bien que vous puissiez l'exécuter à partir d'un shell bash. Il s'agit d'une commande totalement distincte de bash, qui fait partie de la suite d'utilitaires binaires GNU.

57
Cascabel

La réponse acceptée est très bonne mais juste pour compléter vos autres questions (et aussi comme référence pour toute personne qui se retrouve ici).

Quel est l'équivalent de gcc -s en termes de bande avec certaines de ses options?

Ils font tous les deux la même chose, supprimant complètement la table des symboles. Cependant, comme l'a souligné @JimLewis, strip permet un contrôle plus fin. Par exemple, dans un objet déplaçable, strip --strip-unneeded ne supprimera pas ses symboles globaux. Cependant, strip ou strip --strip-all supprimerait le tableau complet des symboles.

Lequel utilisez-vous pour réduire la taille de l'exécutable et accélérer son exécution

La table des symboles est une section non allouable du binaire. Cela signifie qu'il n'est jamais chargé dans la mémoire RAM. Il stocke des informations qui peuvent être utiles pour déboguer les purporses, par exemple, pour imprimer une trace de pile lorsqu'un crash se produit. Un cas où il pourrait faire sens pour supprimer la table des symboles serait un scénario où vous avez de sérieuses contraintes de capacité de stockage (à cet égard, gcc -Os -s ou make CXXFLAGS="-Os -s" ... est utile car il se traduira par un binaire plus lent plus petit qui est également supprimé pour réduire davantage la taille). Je ne pense pas que la suppression de la table des symboles entraînerait un gain de vitesse pour les raisons commentées.

Enfin, je recommande ce lien pour supprimer les objets partagés: http://www.technovelty.org/linux/stripping-shared-libraries.html

41
Diego Pino

"gcc -s" supprime les informations de relocalisation ainsi que la table des symboles qui n'est pas effectuée par "strip". Notez que la suppression des informations de relocalisation aurait un certain effet sur randomisation de la disposition de l'espace adresse. Voir ce lien.

12
Khaled

Ils font des choses similaires, mais strip permet un contrôle plus fin sur ce qui est supprimé du fichier.

5
Jim Lewis