6 pontos por GN⁺ 2024-02-03 | 1 comentários | Compartilhar no WhatsApp

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, puts e _start.
  • O programa começa em _start, e não em main.

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!

  • objdump oferece uma forma melhor de visualizar o binário.
  • É possível ver seções como .text, .rodata e .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 .text conté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, nm e objdump.

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

 
GN⁺ 2024-02-03
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 main quando é executado, na prática ele começa em _start. O _start realiza várias tarefas importantes, como chamar main, 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)".