Option gcc -mpreferred-stack-boundary

Je veux savoir comment utiliser l’ -mpreferred-stack-boundary lors de la compilation dans le compilateur GNU. J’ai vérifié la documentation mais l’explication est perdue pour moi. Quelqu’un pourrait-il l’expliquer s’il vous plaît?

Je veux savoir comment utiliser l’option -mpreferred-stack-boundary lors de la compilation dans le débogueur GNU.

L’option n’a absolument rien à voir avec le débogueur.

Cela affecte le code généré dans votre fichier binary. Par défaut, GCC organisera les choses de manière à ce que le pointeur de stack de chaque fonction, immédiatement après son entrée, soit aligné sur une limite de 16 octets (cela peut être important si vous avez des variables locales et activez les instructions sse2 ).

Si vous modifiez la valeur par défaut, par exemple -mpreferred-stack-boundary=2 , GCC alignera le pointeur de stack sur une limite de 4 octets. Cela réduira les exigences de stack de vos routines, mais se bloquera si votre code (ou votre code que vous appelez) utilise sse2 , il n’est donc généralement pas sûr.

Cela a à voir avec les limites d’octets que votre programme utilise lorsqu’il est mis en mémoire.

Une limite de stack = 2 garantit que la stack est configurée en incréments de taille dword, ce qui empêche votre machine d’optimiser la stack.

Si vous consultez:

 `info gcc and search by entering "/mpreferred-stack-boundary"` it says: >-mpreferred-stack-boundary=num > 

Essayez de garder la limite de la stack alignée sur un 2 élevé à la limite de l’octet num. Si -mpreferred-stack-boundary n’est pas spécifié, la valeur par défaut est 4 (16 octets ou 128 bits).

Une limite de stack par défaut de 4 est la même pour les machines Intel 386 et AMD x86-64.

Lorsque j’essaie d’utiliser l’option “m-preferred-stack-boundary = 2” sur ma machine Linux 64 bits, la compilation échoue avec l’erreur

“-mpreffered-stack-boundary = 2 n’est pas compris entre 4 et 12”.

En effet, la largeur du champ d’adresse est passée de 4 à 8 octets dans les machines 64 bits. Donc, il ne peut pas écrire des morceaux individuels à une limite de stack = 2 car 2 ^ 2 = 4 octets. Cependant, de manière intéressante, une limite de stack de 3 renvoie toujours une erreur sur les machines 32 et 64 bits, ce qui constituerait une limite de 8 octets.

Je ne peux pas inclure le lien parce que je n’ai pas 10 réputation … mais une recherche se transforme assez facilement. Autant que je puisse le dire, c’est une fonctionnalité de sécurité car 8 octets sont susceptibles de mal aligner la stack … quelqu’un d’autre sait mieux ou a plus de détails.

Comment la stack s’est mal alignée, dit:

Pour garantir un alignement correct de ces valeurs sur la stack, la limite de la stack doit être alignée sur celle requirejse par toute valeur stockée dans la stack. De plus, chaque fonction doit être générée de manière à maintenir la stack alignée. Ainsi, l’appel d’une fonction compilée avec une limite de stack préférée supérieure à partir d’une fonction compilée avec une limite de stack préférée sera probablement mal alignée. Il est recommandé que les bibliothèques qui utilisent des rappels utilisent toujours le paramètre par défaut.

Cet alignement supplémentaire consum un espace de stack supplémentaire et augmente généralement la taille du code. Le code sensible à l’utilisation de l’espace de stack, comme les systèmes intégrés et les kernelx de système d’exploitation, peut vouloir réduire l’alignement préféré à -mpreferred-stack-boundary = 2.

bon, il est utile d’utiliser -mpreferred-stack-boundary avec 2 pour facilement démonter ce qui se passe, sinon il sera optimisé et difficile de suivre ce qui se passe dans la stack. pour 64 bits à droite, vous avez besoin de 4 au moins