gcc hat einen -frecord-gcc-switches
Option dafür:
-frecord-gcc-switches
This switch causes the command line that was used to invoke the compiler to
be recorded into the object file that is being created. This switch is only
implemented on some targets and the exact format of the recording is target
and binary file format dependent, but it usually takes the form of a section
containing ASCII text.
Danach enthalten die ausführbaren ELF-Dateien .GCC.command.line
Abschnitt mit diesen Informationen.
$ gcc -O2 -frecord-gcc-switches a.c
$ readelf -p .GCC.command.line a.out
String dump of section '.GCC.command.line':
[ 0] a.c
[ 4] -mtune=generic
[ 13] -march=x86-64
[ 21] -O2
[ 25] -frecord-gcc-switches
Natürlich funktioniert es nicht für ausführbare Dateien, die ohne diese Option kompiliert wurden.
Für den einfachen Fall von Optimierungen, könnten Sie Versuchen Sie es mit einem Debugger, wenn die Datei mit Debug-Informationen kompiliert wurde. Wenn Sie es ein wenig durchgehen, werden Sie vielleicht feststellen, dass einige Variablen „herausoptimiert“ wurden. Das deutet darauf hin, dass eine Optimierung stattgefunden hat.
Eine weitere Option ist -grecord-gcc-swtiches (beachten Sie, nicht -f, sondern -g). Laut gcc-Dokumentation werden Flags in Zwerg-Debug-Informationen eingefügt. Und es sieht so aus, als wäre es seit gcc 4.8 standardmäßig aktiviert.
Ich habe festgestellt, dass das Programm dwarfdump nützlich ist, um diese Cflags zu extrahieren. Beachten Sie, dass das String-Programm sie nicht sieht. Sieht so aus, als ob Zwergeninformationen komprimiert sind.
Wenn Sie mit dem -frecord-gcc-switches
kompilieren Flag, dann werden die Optionen des Befehlszeilen-Compilers in die Binärdatei in den Anmerkungsabschnitt geschrieben. Siehe auch die Dokumentation.