Il n'y a pas de solution universelle, mais vous pouvez faire une supposition éclairée en recherchant des tâches effectuées par un seul compilateur.
GCC est le plus facile. il écrit une .comment
section contenant la chaîne de la version GCC (la même chaîne que si vous exécutiez gcc --version
). Je ne sais pas s'il y a un moyen de l'afficher avec readelf
, mais avec objdump
c'est:
objdump -s --section .comment /path/binary
Je viens de me rendre compte que j'ai ignoré le reste de votre question. Les drapeaux ne sont généralement sauvegardés nulle part; ils seraient probablement dans une section de commentaires, mais je n'ai jamais vu cela se faire. Il y a une place dans l'en-tête COFF pour un horodatage, mais il n'y a pas d'équivalent dans ELF, donc je ne pense pas que le temps de compilation soit disponible non plus
objdump
? Donne-t-il plus d'informations? Disponible sur différentes plateformes? Format de sortie plus propre?Vous pouvez essayer d'utiliser la
strings
commande. Cela créera beaucoup de texte; en le cochant, vous pouvez deviner le compilateur.pubuntu@pubuntu:~$ strings -a a.out |grep -i gcc
GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3
Ici, je sais qu’il est compilé avec
gcc
mais vous pouvez toujours rediriger lastrings
sortie vers un fichier et l’examiner.Il existe un très bon utilitaire appelé
peid
Windows, mais je ne trouve aucune alternative sous Linux.la source
Il y a deux méthodes. Les deux vont donner le même résultat
En utilisant la commande readelf,
readelf -S binary
affichera les en-têtes de 40 sections dans le binaire. Notez le numéro de série de l'en.comment
-tête de section. Dans mon système, il était indiqué que 27 (peut être différent pour votre cas)readelf -x 30 path/to/binary
-> qui affichera le vidage hexadécimal de la section '.comment'. Dans ce vidage, vous pouvez voir le compilateur utilisé pour construire le binaire.la source
readelf ou objdump les deux peuvent le faire.
Le fichier ELF compilé par gcc ajoutera les sections .note.ABI-tag et .note.gnu.build-id. les deux pourraient afficher
option "s" signifie afficher tout le contenu, "j" pour indiquer le nom de la section. Ce style récupère le contenu hexadécimal de cette section.
affichera une fois le contenu lisible par l'homme de ELFFILE. l'option "n" signifie NOTES.
Choisissez un comme votre comme.
À propos, utilisez objcopy, vous pouvez ajouter votre propre section dans un fichier elf.
la source
readelf -n
a travaillé pour moi - exemple de sortie:Displaying notes found in: .note.gnu.build-id Owner Data size Description GNU 0x00000014 NT_GNU_BUILD_ID (unique build ID bitstring) Build ID: b88bae04e9043b71b329bac0ce2a2e5314183272
Vous pouvez également utiliser ce script intelligent qui compte le nombre d'instructions de processeur utilisées par le binaire. Il est basé sur l'analyse de la sortie d'objdump. Attention, la finition peut être assez longue si vous l'utilisez sur un gros fichier binaire.
la source
Peut-être un coup de chance, selon le programme. Certains programmes auront cette information compilée et accessible par une sorte d’appel de version (-V, --version, -Version, etc.). Vous pouvez trouver n'importe quel sous-ensemble des éléments que vous recherchez (y compris un ensemble nul). Voici un exemple particulièrement fructueux, Perl 5:
la source
Si vous ouvrez un fichier binaire ELF dans 7-zip, il listera les différentes sections qu'il contient. À partir de là, vous pouvez utiliser l’option Afficher le menu contextuel de la section ".comment", par exemple, pour afficher les commentaires du compilateur (par exemple, "GCC: (GNU) 4.9 20150123 (version préliminaire) Android version 3.8.256229 (basée sur LLVM 3.8.256229) ").
Notez que la section ".comment", si elle existe, semble commencer par un caractère nul. Assurez-vous donc de choisir une application de visionneuse à utiliser dans une version 7-zip qui ne soit pas gênée par cela (par exemple, essaie d'interpréter le données en Unicode). Les autres sections pouvant exister et présenter un intérêt sont ".note. *".
la source