it-swarm.com.de

Wie deaktiviere ich Compiler-Optimierungen in gcc?

Ich versuche, Assemblersprache zu lernen. Ich habe gesucht und gefunden, wie man eine .c - Datei zerlegt, aber ich denke, sie produziert eine optimierte Version des Programms. Gibt es eine Möglichkeit, damit ich den genauen Assembly-Code sehen kann, der meiner C-Datei entspricht.

68
Neal

Die Option gcc -O Ermöglicht verschiedene Optimierungsstufen. Deaktivieren Sie sie mit -O0 Und geben Sie sie mit -S Aus. -O3 Ist die höchste Optimierungsstufe.

Ab gcc 4.8 steht die Optimierungsstufe -Og Zur Verfügung. Es ermöglicht Optimierungen, die das Debuggen nicht beeinträchtigen, und ist die empfohlene Standardeinstellung für den Standardzyklus zum Bearbeiten, Kompilieren und Debuggen.

Verwenden Sie -masm=intel Oder -masm=att, Um den Dialekt der Assembly in Intel oder Att zu ändern.

Sie können bestimmte Optimierungen auch manuell mit -fname Aktivieren.

Schauen Sie sich das gcc manual an, um mehr zu erfahren.

94
pmr

Für gcc soll kein - O1 -O2 oder - O3 angegeben werden Optionen, die an den Compiler übergeben wurden oder über die Sie bereits verfügen, können Sie die Option - O0 anhängen, um sie wieder zu deaktivieren. Es kann Ihnen auch helfen, - g für das Debuggen hinzuzufügen, damit Sie die c-Quelle und den disassemblierten Maschinencode in Ihrem Debugger sehen können.

Siehe auch: http://sourceware.org/gdb/onlinedocs/gdb/Optimized-Code.html

8
IanNorton

Verwenden Sie den Schalter -O0 (- [Kapital o] [Null]), um die Optimierung zu deaktivieren, und -S, um die Assembly-Datei abzurufen. Schauen Sie sich hier an, um weitere gcc-Befehlszeilenoptionen anzuzeigen.

6
MByD

Fügen Sie "-fno-elide-constructors" hinzu, um ohne Kopierentscheidung zu testen und zu sehen, wie Sie Konstruktoren/Operatoren in Aktion kopieren/verschieben.

Selbst ohne Optimierungen (-O0) führen GCC und Clang weiterhin eine Kopierentfernung durch, wodurch in einigen Fällen Konstruktoren zum Kopieren/Verschieben übersprungen werden. Siehe diese Frage für Details zur Kopierentscheidung.

In Clang 3.4 löst es jedoch einen Fehler aus (ein ungültiges temporäres Objekt ohne aufrufenden Konstruktor), der in 3.5 behoben ist.

6
user3770818

Sie können Optimierungen deaktivieren, wenn Sie -O0 mit der gcc-Befehlszeile übergeben.

Z.B. So wandeln Sie eine C-Datei in einen S-Dateiaufruf um:

gcc -O0-S test.c

1

Vor langer Zeit aber noch gebraucht.

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

Sie können Optimierungen auch intern mit #pragma GCC Push_options steuern

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

.... code here .....

#pragma GCC pop_options
0
mckenzm