Como um arquivo executável binário é organizado? Vamos explorar!
- Um arquivo executável não é algo incompreensível; ele segue um formato de arquivo regular.
- O texto trata de binários ELF no Linux e usa a linguagem C, mas outras linguagens compiladas também se aplicam.
- Você aprende sobre símbolos (symbols), seções (sections) e segmentos (segments).
- Os símbolos são como nomes de funções, ficam organizados em seções, e as seções compõem os segmentos.
- A ferramenta
readelfé usada para examinar esses elementos.
Etapa 1: abrir no editor de texto!
- É a forma mais simples de olhar para um binário, e dá para encontrar os textos "Penguin!" e "ELF".
Etapa 2: ver a tabela de símbolos com readelf
- É possível ver os símbolos com
readelf --symbols. - Você pode encontrar símbolos como
main,putse_start. - O programa começa em
_start, e não emmain.
Símbolos
- Ao escrever um programa, são gerados símbolos para as funções.
- Quando uma função é chamada a partir de uma biblioteca, os símbolos são necessários para localizar o código dessa função.
- A ligação é feita por meio de ligação estática (static linking) e ligação dinâmica (dynamic linking).
Etapa 3: ver o binário com objdump e aprender sobre seções!
objdumpoferece uma forma melhor de visualizar o binário.- É possível ver seções como
.text,.rodatae.interp. - As seções são usadas no tempo de linkedição, e os segmentos são usados em tempo de execução.
Etapa 4: ver assembly!
- A seção
.textcontém código em assembly. - É possível ver o código em assembly com
objdump -d.
Etapa 5: ver os segmentos!
- O programa é composto por segmentos, ou cabeçalhos de programa.
- É possível ver os segmentos com
readelf --segments. - Os segmentos determinam como as diferentes partes do programa serão separadas na memória.
Não é mágica!
- Arquivos executáveis não são mágicos, e o ELF é como qualquer outro formato de arquivo.
- Você pode investigar binários Linux com
readelf,nmeobjdump.
GN⁺ opina
- Este texto é muito útil para engenheiros de software iniciantes entenderem a estrutura de arquivos executáveis binários.
- Ele oferece informações práticas sobre os conceitos de símbolos, seções e segmentos, e sobre as ferramentas para investigá-los (
readelf,objdump). - Também ajuda a construir uma compreensão básica de como um programa é realmente carregado na memória e executado, o que pode despertar interesse por programação de sistemas.
1 comentários
Comentários do Hacker News
Um usuário recomenda escrever um ELF (Executable and Linkable Format) manualmente, dizendo que isso ajuda bastante a entender as partes básicas de um executável. Também afirma que este texto é útil para quem quer uma abordagem de cima para baixo, em vez da abordagem tradicional de baixo para cima.
Outro usuário explica que, embora possamos pensar que um programa começa em
mainquando é executado, na prática ele começa em_start. O_startrealiza várias tarefas importantes, como chamarmain, e não é algo específico da linguagem C, mas sim o ponto de entrada de um binário independente da linguagem.Um usuário menciona que os artigos da Julia são sempre excelentes e diz que teve bons resultados ao ensinar às pessoas que código compilado não guarda segredos, demonstrando isso com o comando
strings.Um usuário diz que estudou esse tema pela primeira vez quando mudou sua carreira acadêmica da matemática para a ciência da computação, e comenta que nunca se arrependeu dessa investigação aprofundada. Também observa que Julia tem formação em matemática e acha que esse desejo por raciocínio de cima para baixo pode ter levado matemáticos a esse tipo de experimento.
Um usuário compartilha uma experiência que reflete o fato de executáveis serem específicos de cada plataforma, dizendo que conseguiu provar que um "executável realmente portátil" podia rodar em várias plataformas. Isso significa que a solução para o problema multiplataforma — que se tentou resolver de várias formas, como Java e bibliotecas cross-platform — estava diante dos nossos olhos havia muito tempo.
Um usuário diz que, no começo dos anos 90, ficou fascinado pelos formatos de executáveis e escreveu um visualizador de executáveis de DOS e Windows em Modula 2. O programa foi lançado como shareware em 1991 com o nome VEXE, ganhou certo número de seguidores entre crackers e chegou a ser mencionado no tutorial +ORC.
Um usuário diz que imprimir um arquivo binário no terminal é motivo de tristeza, e que prefere usar
hexdump -C.Vários usuários mencionam que este é um excelente tópico.
Um usuário recomenda a quem se interessa por esse assunto ler sobre Cosmopolitan e RedBean, além de "αcτµαlly pδrταblε εxεcµταblε (2020)".