Portal do Governo Brasileiro

 

ELF


Descrição

ELF (Executable and Linking Format) é um formato usado em arquivos (executáveis e objetos), bibliotecas e core dumps. O uso deste formato facilita a portabilidade para outros sistemas.

Estrutura

Um arquivo executável com o formato ELF consiste de um cabeçalho ELF seguido por:

Cabeçalho ELF

O cabeçalho ELF aparece no início do arquivo e descreve as estruturas dos cabeçalhos de programa e dos cabeçalhos de seção. Abaixo é mostrado o cabeçalho ELF para a arquitetura de 64 bits.

typedef struct
{
   unsigned char e_ident[EI_NIDENT]; /* Magic number and other info */
   Elf64_Half e_type; /* Object file type */
   Elf64_Half e_machine; /* Architecture */
   Elf64_Word e_version; /* Object file version */
   Elf64_Addr e_entry; /* Entry point virtual address */
   Elf64_Off e_phoff; /* Program header table file offset */
   Elf64_Off e_shoff; /* Section header table file offset */
   Elf64_Word e_flags; /* Processor-specific flags */
   Elf64_Half e_ehsize; /* ELF header size in bytes */
   Elf64_Half e_phentsize; /* Program header table entry size */
   Elf64_Half e_phnum; /* Program header table entry count */
   Elf64_Half e_shentsize; /* Section header table entry size */
   Elf64_Half e_shnum; /* Section header table entry count */
   Elf64_Half e_shstrndx; /* Section header string table index */
} Elf64_Ehdr;

Os campos do cabeçalho ELF são discutidos com um pouco mais de detalhes abaixo.

Para verificar o conteúdo do cabeçalho ELF de um arquivo use o comando readelf. Por exemplo,

readelf -h teste
mostra o conteúdo do do cabeçalho ELF do arquivo executável teste.
Cabeçalho ELF:
   Mágico:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
   Classe: ELF64
   Dados: complemento de 2, little endian
   Versão: 1 (current)
   OS/ABI:         UNIX - System V
   Versão ABI: 0
   Tipo: EXEC (Arquivo executável)
   Máquina: Advanced Micro Devices X86-64
   Versão: 0x1
   Endereço do ponto de entrada:    0x400490
   Início dos cabeçalhos de programa:    64 (bytes dentro do arquivo)
   Princípio do cabeçalho da seção:    4472 (bytes dentro do arquivo)
   Sinalizações: 0x0
   Tamanho deste cabeçalho: 64 (bytes)
   Tamanho dos cabeçalho dos programas: 56 (bytes)
   Número do cabeçalho do programa: 9
   Tamanho do cabeçalho da seção: 64 (bytes)
   Número do cabeçalho da seção: 30
   Sequência do índice da tabela cabeçalho da seção: 27

Tabela de cabeçalhos do programa

A tabela de cabeçalhos do programa de um arquivo objeto executável ou compartilhável é composta por um conjunto de estuturas, onde cada estrutura descreve um segmento (a memória alocada para a execução de um processo é dividida em segmentos) ou outra informação que o sistema precisa para preparar o programa para a execução. O segmento de um arquivo objeto contém uma ou mais seções. Abaixo é apresentado o cabeçalho de um segmento na arquitetura de 64 bits.

typedef struct
{
   Elf64_Word p_type; /* Segment type */
   Elf64_Word p_flags; /* Segment flags */
   Elf64_Off p_offset; /* Segment file offset */
   Elf64_Addr p_vaddr; /* Segment virtual address */
   Elf64_Addr p_paddr; /* Segment physical address */
   Elf64_Xword p_filesz; /* Segment size in file */
   Elf64_Xword p_memsz; /* Segment size in memory */
   Elf64_Xword p_align; /* Segment alignment */
} Elf64_Phdr;;

Os campos do cabeçalho do programa são discutidos com um pouco mais de detalhes abaixo.

Para verificar o conteúdo do cabeçalho do programa de um arquivo use o comando readelf. Por exemplo,

readelf -l teste
mostra o conteúdo do cabeçalho do programa do arquivo executável teste.

Tabela de cabeçalhos de seção

A tabela de cabeçalhos de seção mantém informações sobre todas as seções do arquivo. Abaixo é mostrada a estrutura da arquitetura de 64 bits.

typedef struct
{
   Elf64_Word sh_name; /* Section name (string tbl index) */
   Elf64_Word sh_type; /* Section type */
   Elf64_Xword sh_flags; /* Section flags */
   Elf64_Addr sh_addr; /* Section virtual addr at execution */
   Elf64_Off sh_offset; /* Section file offset */
   Elf64_Xword sh_size; /* Section size in bytes */
   Elf64_Word sh_link; /* Link to another section */
   Elf64_Word sh_info; /* Additional section information */
   Elf64_Xword sh_addralign; /* Section alignment */
   Elf64_Xword sh_entsize; /* Entry size if section holds table */
} Elf64_Shdr;

Os campos do cabeçalho de seção são discutidos com um pouco mais de detalhes abaixo.

Para verificar o conteúdo do cabeçalho de seção de um arquivo use o comando readelf. Por exemplo,

readelf -S teste
mostra o conteúdo do cabeçalho de seção do arquivo executável teste.

Observações

 

  Topo   |   Guia   |   Home