web-dev-qa-db-fra.com

Comment désactiver les optimisations du compilateur dans gcc?

J'essaie d'apprendre la langue de l'Assemblée. J'ai cherché et trouvé comment démonter un .c fichier mais je pense qu’il produit une version optimisée du programme. Existe-t-il un moyen de voir le code d'assemblage exact qui correspond à mon fichier C.

68
Neal

L'option gcc -O permet différents niveaux d'optimisation. Utilisation -O0 pour les désactiver et utiliser -S pour sortir Assembly. -O3 est le niveau d'optimisation le plus élevé.

A partir de gcc 4.8, le niveau d'optimisation -Og est disponible. Il permet des optimisations qui n'interfèrent pas avec le débogage et constitue la valeur par défaut recommandée pour le cycle standard éditer, compiler et déboguer.

Pour changer le dialecte de l’Assemblée en intel ou att, utilisez -masm=intel ou -masm=att.

Vous pouvez également activer manuellement certaines optimisations avec -fname.

Regardez le manuel gcc pour beaucoup plus.

94
pmr

Pour gcc vous voulez omettre tout - O1 -O2 ou - O3 Si les options sont passées au compilateur ou si vous les avez déjà, vous pouvez ajouter l’option - O0 pour la désactiver à nouveau. Cela pourrait également vous aider d’ajouter - g pour le débogage afin que vous puissiez voir le code source c et le code machine désassemblé dans votre débogueur.

Voir aussi: http://sourceware.org/gdb/onlinedocs/gdb/Optimized-Code.html

8
IanNorton

Utilisez le commutateur -O0 (- [capital o] [zéro]) pour désactiver l'optimisation et -S pour obtenir le fichier d'assemblage. Regardez ici pour voir plus d'options de ligne de commande gcc.

6
MByD

Pour tester sans copie de copie et voir copier/déplacer des constructeurs/opérateurs en action, ajoutez "-fno-elide-constructors".

Même sans optimisation (-O0), GCC et Clang continueront à effectuer l’élision de copie, ce qui aura pour effet de sauter les constructeurs de copie/déplacement dans certains cas. Voir cette question pour plus de détails sur la copie.

Cependant, dans Clang 3.4, cela provoque un bogue (un objet temporaire non valide sans constructeur constructeur), qui est corrigé dans la version 3.5.

6
user3770818

Vous pouvez désactiver les optimisations si vous passez -O0 avec la ligne de commande gcc.

Par exemple. transformer un fichier .C en appel de fichier .S:

gcc -O0 -S test.c

1
Nils Pipenbrinck

Il y a longtemps, mais toujours nécessaire.

info - https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
list - gcc -Q --help=optimizers test.c | grep enabled
disable as many as you like with:
  gcc **-fno-web** -Q --help=optimizers test.c | grep enabled
1
api

Vous pouvez également contrôler les optimisations en interne avec #pragma GCC Push_options

#pragma GCC Push_options
/* #pragma GCC optimize ("unroll-loops") */     

.... code here .....

#pragma GCC pop_options
0
mckenzm