Quel est l'usage de-FNO-stack-protector?

j'ai écrit une application en C, et j'essaie de comprendre quel est le but de la commande-FNO-stack-protector lors de la compilation. Pour mon application spécifique, cela ne fait aucune différence si j'utilise cette commande ou pas en termes de protection contre le débordement de tampon.

j'ai lu en ligne que les commandes-fstack-protector et-FNO-stack-protector activent et désactivent respectivement le protecteur stack-smashing, mais si je compilais moi-même l'application, comment le protecteur être activé à l'avance? L'utilisation de la commande peut-être dépendre du système sur lequel l'application s'exécute sur?

Merci

19
demandé sur Jonathan Wakely 2012-05-23 07:16:26

4 réponses

dans le standard / stock GCC, le protecteur de pile est désactivé par défaut. Cependant, certaines distributions Linux ont corrigé GCC pour l'activer par défaut. À mon avis, cela est plutôt nuisible, car cela brise la possibilité de compiler tout ce qui n'est pas lié aux bibliothèques userspace standard à moins que le Makefile ne désactive spécifiquement le protecteur de la pile. Cela briserait même la construction du noyau Linux sauf que les distributions avec ce hack ont ajouté des hacks supplémentaires à GCC pour détecter que le noyau est être construit et le désactiver.

12
répondu R.. 2012-05-23 03:23:40

Si vous compilez avec -fstack-protector, alors il y aura un peu plus d'espace alloué sur la pile et un peu plus de frais généraux à l'entrée et au retour d'une fonction pendant que le code met en place les vérifications et vérifie ensuite si vous avez réécrit la pile pendant que vous êtes dans la fonction.

cela fera une différence pour votre application. Si cette option est activée, elle évitera rapidement les attaques de débordement de pile. Seulement si vous n'avez pas d'appels de fonction dans votre code serait-il laisser votre programme non affecté (et puisque vous écrivez normalement main(), et c'est une fonction qui est appelée par le code de démarrage, cela aurait un effet sur votre programme). Cependant, les attaques de débordement de pile ne sont pas les seules attaques possibles qui peuvent être utilisées, ce n'est donc pas une panacée. Mais c'est une protection utile avec un coût limité.

La protection ne dépend pas du système en soi; elle dépend de la version du compilateur que vous utilisez, mais c'est tout.

11
répondu Jonathan Leffler 2012-05-23 03:26:08

le protecteur de pile est le code généré par le compilateur et placé dans votre programme. Ce n'est pas un appel de programme ou de système externe qui est appelé par votre programme.

1
répondu Paul Richter 2012-05-23 03:29:57

les fois où une option qui correspond à un paramètre de compilateur par défaut peut être utile incluent:

  • lorsque vous utilisez un système de construction qui peuvent avoir une configuration complexe que vous souhaitez modifier. Au lieu de comprendre où dans un labyrinthe de makefiles il pourrait choisir d'utiliser fstack-protector (par exemple), il peut vous permettre de passer facilement dans des options supplémentaires qui obtiennent simplement ajouté à la fin de la liste des options. Si GCC voit les deux fstack-protector et fno-stack-protector dans le jeu de options, le dernier sur la ligne de commande est celui qui prend effet.

  • l'autre fois ce genre de chose pourrait être pratique (ce qui ne semble pas s'appliquer à -fstack-protector, cependant) est quand vous avez une option qui active un tas de 'sous-options'. Par exemple, le réglage-O2 tourne sur un slew de -fxxx options d'optimisation,et vous pouvez utiliser -O2 pour la plupart, mais je ne veux pas des optimisations d'alias strictes de GCC. Vous pouvez donc spécifier -fno-strict-aliasing pour le mettre option de retour à son réglage par défaut. (Remarque: ce cas est vraiment à la hauteur pour le cas ci-dessus)

1
répondu Michael Burr 2012-05-23 06:23:23