Y a-t-il un moyen de voir quel compilateur et quels drapeaux ont été utilisés pour créer un fichier exécutable dans * nix? J'ai une ancienne version de mon code compilé et je voudrais voir s'il a été compilé avec ou sans optimisation. Google n'était pas trop utile, mais je ne suis pas sûr d'utiliser les bons mots clés.
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 contenant 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 que l'optimisation a eu lieu.
Si vous compilez avec le -frecord-gcc-switches
flag, les options du compilateur de ligne de commande seront écrites dans le binaire dans la section note. Voir aussi la documentation .
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 naines. Et on dirait qu'il est 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 de chaînes ne les voit pas. On dirait que les informations naines sont compressées.
C'est quelque chose qui nécessiterait le support du compilateur. Vous ne mentionnez pas le compilateur que vous utilisez, mais puisque vous avez marqué votre question linux
je suppose que vous utilisez gcc - qui ne fait pas par défaut la fonctionnalité dont vous parlez (mais -frecord-gcc-switches est une option pour effectuer cela).
Si vous souhaitez inspecter votre binaire, la commande strings
vous montrera tout ce qui semble être une chaîne de caractères lisible dans le fichier.
Je doute fortement que cela soit possible:
int main()
{
}
Lorsque compilé avec:
gcc -O3 -ffast-math -g main.c -o main
Aucun des paramètres ne peut être trouvé dans l'objet généré:
strings main | grep -O3
(no output)
Si vous avez toujours le compilateur (même version) que vous avez utilisé et que vous n'êtes pas sûr d'un seul indicateur, vous pouvez essayer de compiler à nouveau votre code, une fois avec et une fois sans l'indicateur. Ensuite, vous pouvez comparer les exécutables. Votre ancien doit être identique ou très similaire à l'un des nouveaux.