Não existe uma maneira universal, mas você pode fazer um palpite, procurando coisas feitas apenas por um compilador.
O GCC é o mais fácil; ele grava uma .comment
seção que contém a string de versão do GCC (a mesma string que você obtém se executar gcc --version
). Não sei se existe uma maneira de exibi-lo readelf
, mas com objdump
ele:
objdump -s --section .comment /path/binary
Acabei de perceber que ignorei o resto da sua pergunta. As bandeiras geralmente não são salvas em nenhum lugar; eles provavelmente estariam em uma seção de comentários, mas nunca vi isso feito. Há um ponto no cabeçalho COFF para um registro de data e hora, mas não há equivalente no ELF, então não acho que o tempo de compilação esteja disponível também
objdump
? Dá mais informações? Disponível em plataformas diferentes? Formato de saída mais limpo?Você pode tentar usar o
strings
comando Isso criará muita saída de texto; marcando você pode adivinhar o compilador.pubuntu@pubuntu:~$ strings -a a.out |grep -i gcc
GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3
Aqui eu sei que ele é compilado,
gcc
mas você sempre pode redirecionar astrings
saída para um arquivo e examiná-lo.Existe um utilitário muito bom chamado
peid
Windows, mas não consigo encontrar nenhuma alternativa no Linux.fonte
Existem dois métodos. Ambos darão o mesmo resultado
Usando o comando readelf,
readelf -S binary
exibirá os 40 cabeçalhos da seção no binário. Anote o número de série do.comment
cabeçalho da seção. No meu sistema, ele mostrou 27 (pode ser diferente para o seu caso)readelf -x 30 path/to/binary
-> que exibirá o dump hexadecimal da seção '.comment'. Nesse despejo, você pode ver o compilador usado para criar o binário.fonte
readelf ou objdump, ambos podem fazer isso.
O arquivo ELF compilado pelo gcc adicionará .note.ABI-tag e .note.gnu.build-id duas seções. ambos podem ser exibidos por
opção "s" significa exibir o conteúdo completo, "j" para indicar o nome da seção. Esse estilo obtém o conteúdo hexadecimal dessas seções.
mostrará o conteúdo legível por humanos do ELFFILE uma vez. opção "n" significa NOTAS.
Escolha um como quiser.
A propósito, use objcopy, você pode adicionar sua própria seção no arquivo elf.
fonte
readelf -n
trabalhou para mim - exemplo de saída: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
Você também pode usar esse script inteligente que conta os números de várias instruções da CPU usadas pelo binário. É baseado na análise da saída objdump. Lembre-se de que pode levar muito tempo para terminar se você o usar em um grande binário.
fonte
Pode valer a pena um tiro de sorte, dependendo de qual programa. Alguns programas terão isso compilado como informação e acessível por algum tipo de chamada de versão (-V, --version, -Version, etc). Você pode encontrar qualquer subconjunto desses itens que você está procurando (incluindo conjunto nulo). Aqui está um exemplo particularmente proveitoso, o Perl 5:
fonte
Se você abrir um binário ELF no 7-zip, ele listará as várias seções. A partir daí, você pode usar a opção Exibir menu de contexto, por exemplo, na seção ".comment", para ver os comentários do compilador (por exemplo: "GCC: (GNU) 4.9 20150123 (pré-lançamento)), versão Android 3.8.256229 (com base em LLVM 3.8.256229) ").
Lembre-se de que a seção ".comment", se existir, parece começar com um caractere nulo; portanto, escolha um aplicativo visualizador para uso no 7-zip que não fique confuso com isso (por exemplo, tente interpretar o dados como Unicode). Outras seções que podem existir e ser interessantes são ".nota. *".
fonte