Obtenir les options du compilateur à partir d'un exécutable compilé?
Il y avait un moyen de voir ce compilateur et les drapeaux ont été utilisés pour créer un fichier exécutable sous *nix? J'ai une vieille version de mon code compilé et je voudrais voir si il a été compilé avec ou sans optimisation. Google n'était pas trop utile, mais je ne suis pas sûr que je suis en utilisant les mots-clés corrects.
- Ressemble
frecord-gcc-switches
est l'astuce pour gcc, mais est-il une semblable drapeau pour Intel (cpi)? - est-il possible de le faire sans frecord-gcc-interrupteurs? par exemple, regardez au niveau de la boucle de la unroling et ainsi de suite
Vous devez vous connecter pour publier un commentaire.
gcc a un
-frecord-gcc-switches
option pour que:Par la suite, les exécutables ELF contiendra
.GCC.command.line
section avec cette information.Bien sûr, cela ne fonctionnera pas pour les exécutables compilés sans cette option.
Pour le cas simple d'optimisations, vous pourrait essayez d'utiliser un débogueur si le fichier a été compilé avec les informations de débogage. Si vous parcourez un peu, vous remarquerez peut-être que certaines variables ont été "optimisé en sortir". Cela suggère que l'optimisation a eu lieu.
-frecord-gcc-switches
est à peu près ce dont j'ai besoin. Cependant la résultante de la section a-fpreprocessed
, et tous les-D
les définitions de macros ne sont plus là. Comment puis-je les obtenir? (Je suis en train de construire un module du noyau.)-g
options de gcc offre; je me souviens, quelque chose comme-g3
ou-ggdb3
causes pour inclure les définitions de macros dans les informations de débogage. Peut-être que vais vous donner ce que vous cherchez.Si vous compilez avec l'
-frecord-gcc-switches
drapeau, le compilateur en ligne de commande les options seront écrites dans le fichier binaire dans la section note. Voir également la documentation.Une autre option est -grecord-gcc-swtiches (à noter, pas de f-mais -g). Selon gcc docs il va mettre les drapeaux en nain informations de débogage. Et on dirait qu'il est activé par défaut depuis la gcc 4.8.
J'ai trouvé dwarfdump programme utile pour extraire ces cflags. Remarque, les chaînes de programme ne les voit pas. Ressemble nain info est comprimé.
readelf -wi <binary> | grep DW_AT_producer
et il produit une sortie commeDW_AT_producer : GNU C11 5.4.0 20160609 -mtune=generic -march=x86-64 -g -O2 -fstack-protector-strong
ouDW_AT_producer : GNU C 2.96 20000731 (Red Hat Linux 7.2 2.96-112.7.2)
C'est quelque chose qui nécessiterait la prise en charge du compilateur. Vous ne mentionnez pas que le compilateur que vous utilisez, mais puisque vous tagged votre question
linux
je suppose que vous utilisez gcc -- qui n'a pas de défaut, la fonctionnalité vous êtes demandé (mais frecord-gcc-interrupteurs est une option pour effectuer cette).Si vous voulez inspecter votre système binaire, la
strings
commande va vous montrer tout ce qui semble être lisible une chaîne de caractères dans le fichier.J'en doute fortement, il est possible:
Lors de la compilation avec:
Aucun des paramètres peuvent être trouvés dans les objets générés:
readelf
montre qu'il est juste un arrangement différent de la les fonctions, rien explicitement crier "cela a été compilé avec-O3
".Si vous avez encore le compilateur (même version) que vous avez utilisé, et ce n'est qu'un indicateur vous n'êtes pas sûr, vous pouvez essayer de compiler votre code encore une fois, une fois avec et une fois sans le drapeau. Ensuite, vous pouvez comparer les exécutables. Votre ancienne devrait être identiques ou très similaires, à l'un des nouveaux.