Em computação, o Executable and Linking Format (ELF, também chamado de Extensible Linking Format), em português Formato Executável e de Ligação, é um padrão comum de arquivo para executáveis, código objeto, bibliotecas compartilhadas, e core dumps. Publicado pela primeira vez na especificação para a interface binária de aplicação (Application Binary Interface - ABI) da versão denominada System V Release 4 (SVR4) do sistema operacional Unix, e posteriormente no Padrão de Interface de Ferramenta, foi rapidamente aceito entre diferentes fornecedores de sistemas Unix. Em 1999, ele foi escolhido como o formato de arquivo binário padrão para o Unix e sistemas tipo Unix em processadores x86 pelo projeto 86open. O ELF foi escrito por um desenvolvedor da Marinha dos Estados Unidos da América."SYSTEM V RELEASE 4 Programmer's Guide: ANSI C and Programming Support Tools", AT & T (Corporate Author), 800 paginas, 24 de Dezembro de 1992. ISBN 0-13-933706-7 ou ISBN 978-0130206299

Por projeto, o ELF é flexível, extensível e multiplataforma, não ligado a qualquer unidade central de processamento (UCP) determinada ou arquitetura de conjunto de instruções. Isto o possibilitou ser adotado por muitos sistemas operacionais diferentes em muitas plataformas de hardware diferentes.

Actualmente, o formato ELF já substituiu outros formatos de execução mais antigos, tais como a.out e COFF nos sistemas operacionais Linux, Solaris, IRIX, FreeBSD, NetBSD, e OpenBSD. O sistema operacional DragonFly BSD foi ramificado em FreeBSD após a mudança para o ELF. Por causa de outros tipos de formato proprietários, e da plataforma específica, ou menos extensível do que o ELF, alguns usuários defendem que o ELF tem uma melhor qualidade que outros formatos, onde os outros formatos podem o considerar-se um competidor destes. O ELF é também usado nas versões Itanium do OpenVMS, um sistema operacional não baseado no UNIX, além de substituir o Portable Executable no BeOS Revisão 4 e mais tarde na computadores baseados em x86 (computadores PPC mantêm como Preferred Executable Format, nunca usando as Portable Executable), que não são também baseadas no UNIX. Os consoles PlayStation Portable, PlayStation 2 e PlayStation 3 também usam o ELF como seu formato de execução.

O Layout do arquivo ELF thumb|upright=1.2|Um arquivo ELF tem duas visões: o cabeçalho do programa mostra os segmentos usados no tempo de execução, enquanto que o cabeçalho da seção lista o conjunto de seções do binário. Cada arquivo ELF é composto de um cabeçalho ELF, seguido pelos dados do arquivo. Os dados podem incluir:

Tabela de cabeçalho do programa, descrevendo zero ou mais segmentos de memória; Tabela de cabeçalho de seção, descrevendo zero ou mais seções; Dados referidos por entradas na tabela de cabeçalho do programa ou na tabela de cabeçalho de seção.

Os segmentos contêm informações que são necessárias para a execução dos arquivos em tempo de execução, enquanto as seções contêm dados importantes para ligação e relocação. Qualquer byte, no arquivo inteiro, pode ser propriedade de uma seção no máximo e pode haver bytes órfãos que não possuem proprietários por nenhuma seção."Unix System V: Understanding Elf Object Files and Debugging Tools (Programmer Collection)", Mary Lou Nohr, Prentice Hall, Outubro de 1993, ISBN 0-13-933706-7

Cabeçalho do arquivo O cabeçalho ELF define se ele utiliza endereços de 32 ou 64 bits. O cabeçalho contem três campos que são afetados por esta configuração e desloca outros campos que o seguem. O cabeçalho ELF possui um tamanho de 52 ou 64 bytes para binários de 32 e 64 bits, respectivamente.

+ Cabeçalho ELF Deslocamento (offset) Tamanho (bytes) Campo Propósito 32 bits 64 bits 32 bits 64 bits 0x00 4 e_ident[EI_MAG0] à e_ident[EI_MAG3] 0x7F seguido por ELF(45 4c 46) em ASCII; estes quatro bytes constituem o número mágico. 0x04 1 e_ident[EI_CLASS]Este byte é definido para 1 ou 2 para significar os formatos de 32 ou 64 bits, respectivamente. 0x05 1 e_ident[EI_DATA]Este byte é definido para 1 ou 2 para significar extremidade pequena ou grande, respectivamente. Isto afeta a interpretação de campos muitl-bytes que começam com deslocamento (offset) 0x10. 0x06 1 e_ident[EI_VERSION]Define 1 para a versão original de ELF. 0x07 1 e_ident[EI_OSABI]Identifica a ABI do sistema operacional alvo. ValorABI0x00System V0x01HP-UX0x02NetBSD0x03Linux0x04GNU Hurd0x06Solaris0x07AIX0x08IRIX0x09FreeBSD0x0ATru640x0BNovell Modesto0x0COpenBSD0x0DOpenVMS0x0ENúcleo do NonStop0x0FAROS0x10Fenix OS0x11CloudABI É frequentemente definido para 0 independente da plataforma alvo. 0x08 1 e_ident[EI_ABIVERSION]Além disso, especifica a versão ABI. Sua interpretação depende do ABI alvo. O núcleo do Linux (após, pelo menos, a versão 2.6) não tem sua definição. Nesse caso, o deslocamento e o tamanho de EI_PAD é 8. 0x09 7 e_ident[EI_PAD]atualmente não utilizado 0x10 2 e_type1, 2, 3, 4 especifica se o objeto é relocável, executável, compartilhado ou principal, respectivamente. 0x12 2 e_machineEspecifica a arquitetura de conjunto de instruções. Alguns exemplos são: ValorISA0x00 Sem conjunto de instruções específico0x02SPARC0x03x860x08MIPS0x14PowerPC0x16S3900x28ARM0x2ASuperH0x32IA-640x3Ex86-640xB7AArch640xF3RISC-V 0x14 4 e_versionDefinido para 1 para a versão original de ELF. 0x18 4 8 e_entryEste é o endereço de memória do ponto de entrada de onde o processo inicia a execução. Este campo é do tamanho de 32 ou 64 bits dependendo do formado definido anteriormente. 0x1C 0x20 4 8 e_phoffAponta para o início da tabela de cabeçalho do programa. Normalmente segue o cabeçalho de arquivo imediatamente, fazendo do deslocamento (offset) 0x34 ou 0x40 para executáveis ELF de 32 e 64 bits, respectivamente. 0x20 0x28 4 8 e_shoffAponta para o início da tabela de cabeçalho de seção. 0x24 0x30 4 e_flagsA interpretação deste campo depende da arquitetura alvo. 0x28 0x34 2 e_ehsizeContém o tamanho deste cabeçalho, normalmente 64 Bytes para o formato de 64 bits e 52 Bytes para o formato de 32 bits. 0x2A 0x36 2 e_phentsizeContem o tamanho de uma entrada de tabela de cabeçalho de programa. 0x2C 0x38 2 e_phnumContem o número de entradas na tabela de cabeçalho e programa. 0x2E 0x3A 2 e_shentsizeContem o tamanho de uma entrada de tabela de cabeçalho de seção. 0x30 0x3C 2 e_shnumContem o número de entradas na tabela de cabeçalho de seção. 0x32 0x3E 2 e_shstrndxContem o índice da entrada da tabela de cabeçalho de seção que contem os nomes de seção.

Ferramentas readelf é um utilitário para binários do UNIX que mostra informações sobre um ou mais arquivos ELF. Um implementação da GPL é disponível pelo GNU Binutils. elfdump é um comando do Solaris para ver informações sobre os arquivos elf. objdump mostra um grande gama de informações sobre os arquivos ELF e outros tipos de objeto.

Ver também Portable Executable (PE) DWARF Mach-O

Ligações Externas Manual dos formatos dos binarios do FreeBSD "Tool Interface Standard" (TIS) ferramenta de padrões dos executáveis e formatos de especificações de formatos de Linkagem (ELF) Versão 1.2 (PDF) Descrição dos formatos de arquivos binários ELF Article "LibElf e GElf - Um biblioteca para manipular arquivos ELF" por Neelakanth Nadgir biblioteca de acesso liberado para objetos de arquivos ELF elf(5) manual biblioteca de rotinas Elf ELFIO: uma biblioteca C++ para leitura e geração de arquivosno formato binario ELF. "Um tutorial gigantesco sobre a criação de pequeninos executáveis ELF para o Linux" Um herói não celebrado: O funcional ELF Perguntas mais freqüentes sobre NetBSD ELF Objeto ELF (formato de arquivo) para Dissecção ELF-64 detalhes sobre o formato do arquivo objeto ELF-64 formato de arquivo objeto: Versão 1.5 Esboço 2 Sun's Linker and Libraries Guide.

Categoria:Formatos de arquivo para computador