O que é o formato de ficheiro O?
Um arquivo .o é um arquivo de objeto compilado - um binário intermediário produzido por um compilador como GCC ou Clang quando ele traduz um único arquivo-fonte C em código de máquina. A saída contém instruções de máquina, segmentos de dados inicializados e não inicializados, uma tabela de símbolos e entradas de realocação, mas ainda não é executável: referências a funções e variáveis definidas em outras unidades de tradução são deixadas como marcadores não resolvidos para o vinculador.
O formato binário depende da plataforma de destino:
- No Linux e na maioria dos sistemas Unix/BSD, os arquivos
.ousam o contêiner ELF (Executable and Linkable Format), reconhecido pelos magic bytes\x7FELFno deslocamento de byte 0 e ume_typedeET_REL(relocável, valor0x0001). - No macOS, o equivalente usa o formato Mach-O, começando com
CF FA ED FE(64 bits little-endian). - No Windows, o arquivo funcionalmente idêntico é nomeado com a extensão .obj e usa o formato COFF.
Após a compilação, o vinculador (ld) combina um ou mais arquivos .o com bibliotecas para produzir um executável ou uma biblioteca compartilhada. Vários arquivos .o também podem ser agrupados em um arquivo estático usando o comando ar.
Arquivos .o são artefatos de compilação temporários gerados automaticamente pela cadeia de ferramentas e não se destinam a ser abertos por usuários finais. Desenvolvedores que precisam inspecioná-los podem usar nm, objdump ou readelf para examinar símbolos, seções e desmontagem (disassembly).
Segurança e proteção
RISCO: LOWUm .o são dados de tempo de compilação, não algo que o sistema operacional inicia, portanto oferece pouco risco direto aos usuários finais - você não pode clicar duas vezes e executá-lo. Para desenvolvedores, a preocupação é a confiança na cadeia de suprimentos: vincular um objeto de uma fonte não confiável incorpora seu código de máquina diretamente em seu programa, portanto, construa apenas com objetos/bibliotecas de fontes em que você confia. Os objetos em sua própria árvore de compilação são seguros para excluir; eles são regenerados na próxima compilação.
Detalhes do formato
em resumoProgramas que abrem arquivos O
Detalhes técnicos
especificação profunda| Formato de contêiner | ELF no Linux/Unix, Mach-O no macOS, COFF no Windows (onde o arquivo é normalmente nomeado `.obj`) |
| Codificação de arquivo | Binário (não é texto legível por humanos) |
| Magic bytes ELF | `7F 45 4C 46` (`\x7FELF`) no deslocamento de byte 0 - presente em todos os arquivos de objeto baseados em ELF |
| Campo de tipo de objeto ELF | `e_type = ET_REL` (0x0001) no cabeçalho ELF - distingue um objeto relocável de um executável (`ET_EXEC`) ou biblioteca compartilhada (`ET_DYN`) |
| Tipo MIME | `application/x-object`; também transportado como `application/octet-stream` por servidores genéricos |
| Ordem dos bytes | Codificado no byte `EI_DATA` do cabeçalho ELF: little-endian (`ELFDATA2LSB`) em x86/x86-64/ARM, big-endian (`ELFDATA2MSB`) em PowerPC/SPARC |
| Seções principais | `.text` (código executável), `.data` (globais inicializados), `.bss` (globais inicializados com zero), `.rodata` (constantes de apenas leitura) |
| Tabela de símbolos | A seção `.symtab` lista o nome de cada símbolo definido e referenciado, vinculação (local/global/weak), tipo (função/objeto) e valor |
| Entradas de realocação | As seções `.rel.text` / `.rela.text` registram cada slot de endereço que o vinculador deve corrigir ao mesclar arquivos de objeto em um binário final |
| Identificação de arquitetura | O campo `e_machine` no cabeçalho ELF identifica o destino da CPU: `EM_X86_64` (0x3E), `EM_AARCH64` (0xB7), `EM_386` (0x03), etc. |
| Tamanho de arquivo típico | 1 KB a vários MB por unidade de tradução, dependendo da complexidade do código-fonte e do nível de otimização do compilador |
| Compressão | Nenhuma - arquivos de objeto são armazenados como dados binários brutos não compactados |
| Modelo de compilação um-para-um | Exatamente um arquivo `.o` é emitido por unidade de tradução de origem (um por arquivo `.c` ou `.cpp`); o vinculador os mescla posteriormente |
| Empacotamento de biblioteca estática | Vários arquivos `.o` são arquivados em uma biblioteca estática `.a` usando `ar`, que preserva cada objeto como um membro nomeado |
| Resolução apenas em tempo de vinculação | Ao contrário das bibliotecas compartilhadas `.so` / `.dylib`, todas as referências de símbolos em um `.o` são resolvidas inteiramente em tempo de vinculação, não deixando dependências dinâmicas em tempo de execução |
| Ferramentas de inspeção | `nm` (listar símbolos), `objdump` (desmontagem e despejos de seção), `readelf` (detalhes do cabeçalho e seção ELF), `otool` (equivalente Mach-O do macOS) |
| Lançado | Object-file concept from early Unix (1970s); ELF since System V Release 4 (early 1990s) |
| Versão mais recente | ELF format frozen since the 1990s; container evolves with each compiler/ABI |
| Padrão aberto | Sim · livre de royalties |
| Especificação | refspecs.linuxfoundation.org |
Conversões de O
Perguntas e Respostas da Comunidade
perguntado por usuáriosAinda não há perguntas - seja o primeiro a perguntar sobre arquivos O.