web-dev-qa-db-fra.com

Obtenez les options du compilateur à partir d'un exécutable compilé?

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.

47
Mosby

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.

59
Michał Górny

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 .

13
perreal

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.

8

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.

3
mah

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)
1
user1202136

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.

1
Zyx 2000