gcc tiene un -frecord-gcc-switches
opción para eso:
-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.
Luego, los ejecutables ELF contendrán .GCC.command.line
sección con esa información.
$ 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
Por supuesto, no funcionará para ejecutables compilados sin esa opción.
Para el caso simple de optimizaciones, podría intente usar un depurador si el archivo se compiló con información de depuración. Si lo recorre un poco, puede notar que algunas variables se 'optimizaron'. Eso sugiere que se llevó a cabo la optimización.
Otra opción es -grecord-gcc-swtiches (nota, no -f sino -g). De acuerdo con los documentos de gcc, pondrá banderas en la información de depuración enana. Y parece que está habilitado de forma predeterminada desde gcc 4.8.
Descubrí que el programa dwarfdump es útil para extraer esos cflags. Tenga en cuenta que el programa de cadenas no los ve. Parece que la información de los enanos está comprimida.
Si compilas con el -frecord-gcc-switches
bandera, entonces las opciones del compilador de la línea de comandos se escribirán en binario en la sección de notas. Consulte también los documentos.