gcc ha un -frecord-gcc-switches
opzione per questo:
-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.
Successivamente, gli eseguibili ELF conterranno .GCC.command.line
sezione con tali informazioni.
$ 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
Naturalmente, non funzionerà per gli eseguibili compilati senza questa opzione.
Per il semplice caso di ottimizzazioni, potresti prova a utilizzare un debugger se il file è stato compilato con informazioni di debug. Se lo passi un po ', potresti notare che alcune variabili sono state "ottimizzate". Ciò suggerisce che l'ottimizzazione ha avuto luogo.
Un'altra opzione è -grecord-gcc-swtiches (nota, non -f ma -g). Secondo i documenti di gcc, inserirà i flag nelle informazioni di debug nane. E sembra che sia abilitato per impostazione predefinita da gcc 4.8.
Ho trovato il programma dwarfdump utile per estrarre quei cflags. Nota, il programma di stringhe non le vede. Sembra che le informazioni sui nani siano compresse.
Se compili con -frecord-gcc-switches
flag, le opzioni del compilatore della riga di comando verranno scritte nel file binario nella sezione delle note. Vedi anche i documenti.