Wie deaktiviere ich Compiler-Optimierungen in gcc?

76

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

Neal
quelle
1
die gcc- Optionen, die Optimierungen steuern gcc.gnu.org/onlinedocs/gcc-3.3.1/gcc/Optimize-Options.html
abeln
3
Der optimierte Code ist der genaue Code, der Ihrer C-Datei entspricht. Ein Blick auf die Demontage des nicht optimierten Codes erzeugt den falschen Eindruck. Es wird Sie denken lassen, dass Sie es besser machen können.
Hans Passant
1
Wie Hans sagt - die Idee, Assembler-Code zu schreiben, ist, es besser zu machen als der Compiler. Wenn Sie sich den optimierten Code ansehen, werden Sie sehen, wie schwer das ist!
Bo Persson
Ebenfalls verwandt: Deaktivieren Sie alle Optimierungsoptionen in GCC
Peter Cordes

Antworten:

106

Die Option gcc -Oermöglicht verschiedene Optimierungsstufen. Verwenden Sie -O0diese Option, um sie zu deaktivieren und die -SAssembly auszugeben. -O3ist die höchste Optimierungsstufe.

Ab gcc 4.8 steht die Optimierungsstufe -Ogzur 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.

Um den Dialekt der Versammlung in Intel oder Att zu ändern, verwenden Sie -masm=inteloder -masm=att.

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

Weitere Informationen finden Sie im gcc-Handbuch .

pmr
quelle
33
Und -O0ist die Standardeinstellung (keine Optimierung), wenn Sie keine -O-Flags angegeben haben.
Nr.
11
Mit -O0 haben Sie noch die Optimierung: Reduzieren Sie die Kompilierungszeit und lassen Sie das Debuggen die erwarteten Ergebnisse erzielen.
klm123
@ klm123 Richtig, aber es ist eine enge, wie Sie bekommen können, die besser als nichts ist.
PMR
3
Wenn Sie ein einigermaßen modernes gcc haben, das -Og unterstützt, probieren Sie es aus. Ich finde, dass es häufig eine besser lesbare Assembly-Ausgabe liefert als -O0.
Viktor Dahl
@ViktorDahl Danke für den Hinweis. Ich habe die Antwort geändert.
PMR
10

Für gcc möchten Sie alle an den Compiler übergebenen Optionen -O1 -O2 oder -O3 weglassen. Wenn Sie diese bereits haben, 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 zerlegten Maschinencode in Ihrem Debugger sehen können.

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

Ian Norton
quelle
9

Um ohne Kopierelision zu testen und zu sehen, wie Sie Konstruktoren / Operatoren in Aktion kopieren / verschieben, fügen Sie "-fno-elide-Konstruktoren" hinzu.

Selbst ohne Optimierungen (-O0) führen GCC und Clang die Kopierelision durch, was in einigen Fällen dazu führt, dass Kopier- / Verschiebungskonstruktoren übersprungen werden. In dieser Frage finden Sie Details zur Kopierentfernung.

In Clang 3.4 wird jedoch ein Fehler ausgelöst (ein ungültiges temporäres Objekt ohne Aufruf des Konstruktors), der in 3.5 behoben ist.

user3770818
quelle
7

Verwenden Sie die Befehlszeilenoption -O0(- [Großbuchstabe o] [Null]), um die Optimierung zu deaktivieren und -Sdie Assembly-Datei abzurufen. Weitere gcc-Befehlszeilenoptionen finden Sie hier .

MByD
quelle
4

Vor langer Zeit, aber immer 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
api
quelle
4

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
mckenzm
quelle
3

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

Zum Beispiel, um eine .C-Datei in einen .S-Dateiaufruf umzuwandeln:

gcc -O0-S test.c

Nils Pipenbrinck
quelle
3
-O0ist redundant, da dies die Standardeinstellung ist.
Jens