gcc a un -frecord-gcc-switches
option pour cela :
-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.
Ensuite, les exécutables ELF contiendront .GCC.command.line
section avec ces informations.
$ 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
Bien sûr, cela ne fonctionnera pas pour les exécutables compilés sans cette option.
Pour le cas simple des optimisations, vous pourriez essayez d'utiliser un débogueur si le fichier a été compilé avec des informations de débogage. Si vous le parcourez un peu, vous remarquerez peut-être que certaines variables ont été "optimisées". Cela suggère qu'une optimisation a eu lieu.
Une autre option est -grecord-gcc-swtiches (notez, pas -f mais -g). Selon la documentation de gcc, il mettra des drapeaux dans les informations de débogage nain. Et semble être activé par défaut depuis gcc 4.8.
J'ai trouvé que le programme dwarfdump était utile pour extraire ces cflags. Notez que le programme strings ne les voit pas. On dirait que les informations sur les nains sont compressées.
Si vous compilez avec le -frecord-gcc-switches
flag, les options du compilateur de ligne de commande seront écrites en binaire dans la section note. Voir aussi les docs.