O que é o formato de ficheiro SO?
Um arquivo .so contém uma biblioteca compartilhada carregada dinamicamente para aplicativos Unix e Linux. .so é um arquivo binário usado para fornecer acesso a código e dados compartilhados que um ou mais programas podem usar quando iniciados. A extensão significa Shared Object (Objeto Compartilhado), refletindo o fato de que, uma vez que a biblioteca é carregada na memória, seus objetos - funções e dados - podem ser acessados por vários processos simultaneamente. O tipo MIME registrado para arquivos .so é application/x-sharedlib.
As bibliotecas .so são objetos ELF (abreviação de Executable and Linkable Format), o formato binário padrão usado no Linux e em muitos sistemas do tipo Unix para executáveis, objetos compilados, bibliotecas compartilhadas e core dumps. Todo arquivo ELF válido - incluindo arquivos .so - começa com o número mágico de quatro bytes \x7FELF no deslocamento 0. A estrutura do arquivo compreende:
- Cabeçalho ELF - define arquitetura, endianness e bitness (32 bits ou 64 bits), além da contagem de entradas nas tabelas de segmentos e seções,
- Tabela de cabeçalho do programa - descreve os segmentos de memória usados no momento do carregamento,
- Tabela de cabeçalho de seção - descreve seções individuais usadas pelo vinculador e depurador,
- Dados referenciados por esses cabeçalhos.
Os segmentos são usados durante a execução do programa e podem ser compostos de várias seções; as seções são usadas durante a operação de vinculação. Arquivos .so podem ser vinculados a um programa em tempo de compilação ou carregados em tempo de execução via dlopen().
Os nomes de arquivos .so seguem uma convenção de nomenclatura em que o nome da biblioteca é precedido por um prefixo lib - por exemplo, uma biblioteca chamada abc terá o nome de arquivo libabc.so, e a flag -labc é usada ao vincular a ela. O sufixo .so pode ser seguido por um número de versão, como libabc.so.3 para o arquivo de versão principal ou libabc.so.3.1.2 para uma compilação com versão completa. Na prática, libabc.so geralmente é apenas um link simbólico apontando para o arquivo versionado real, e libabc.so.3 pode ser ele próprio um symlink para a versão compatível mais recente. A versão armazenada na entrada dinâmica DT_SONAME é o que o vinculador de tempo de execução ld.so registra e verifica. Algumas bibliotecas de sistema de baixo nível - como o próprio ld.so - não seguem a convenção do prefixo lib.
No Windows, o conceito equivalente é um arquivo .DLL; no macOS, é um arquivo .dylib. Alternativas estáticas no Linux são arquivadas em arquivos .a.
Segurança e proteção
RISCO: MEDIUMUm .so é um código nativo executável que roda dentro de qualquer processo que o carregue, portanto, uma biblioteca compartilhada maliciosa pode fazer qualquer coisa que o programa hospedeiro possa. Os riscos reais: (1) sequestro de biblioteca - um .so malicioso colocado onde o carregador pesquisa primeiro, ou abuso de LD_PRELOAD/LD_LIBRARY_PATH, pode injetar código em um programa legítimo; (2) baixar arquivos .so individuais de sites aleatórios para corrigir um erro - estes podem ser maliciosos ou incompatíveis com a ABI e podem quebrar ou comprometer o sistema. Sempre instale bibliotecas dos repositórios de pacotes assinados da sua distribuição. Excluir arquivos .so do sistema (em /lib, /usr/lib) pode tornar o sistema operacional ou os aplicativos não inicializáveis.
Detalhes do formato
em resumoProgramas que abrem arquivos SO
Detalhes técnicos
especificação profunda| Tipo MIME | application/x-sharedlib |
| Bytes mágicos | 7F 45 4C 46 («\x7FELF») no deslocamento 0 - magia idêntica a todos os arquivos ELF; o campo e_type distingue objetos compartilhados |
| Valor ELF e_type | ET_DYN (0x0003) - distingue um objeto compartilhado de um executável (ET_EXEC = 0x0002) ou objeto realocável (ET_REL = 0x0001) |
| Bitness | Byte EI_CLASS no deslocamento 4: 1 = 32 bits (Elf32), 2 = 64 bits (Elf64); ambas as variantes são amplamente implantadas no Linux |
| Endianness | Byte EI_DATA no deslocamento 5: 1 = little-endian (ELFDATA2LSB), 2 = big-endian (ELFDATA2MSB); específico da arquitetura |
| Código independente de posição | Deve ser compilado com -fPIC para que a biblioteca possa ser mapeada para qualquer endereço virtual sem conflitos de realocação entre processos |
| Tabela de símbolos dinâmicos | A seção .dynsym exporta e importa símbolos visíveis em tempo de execução; .dynstr contém as strings de nomes correspondentes |
| PLT / GOT | Procedure Linkage Table e Global Offset Table permitem a resolução de símbolos preguiçosa (padrão) ou imediata (-z now) no momento do carregamento |
| soname (DT_SONAME) | Nome canônico da biblioteca incorporado na seção dinâmica ELF; o ld.so registra esse nome quando um programa é vinculado, permitindo o rastreamento da versão ABI independentemente do nome do arquivo |
| Versionamento de símbolos | As seções .gnu.version e .gnu.version_r permitem várias versões de símbolos em um único arquivo, possibilitando a evolução da ABI com compatibilidade reversa |
| Vinculador de tempo de execução | Carregado por ld.so / ld-linux-x86-64.so.2; caminho de busca controlado por LD_LIBRARY_PATH, DT_RUNPATH, ou /etc/ld.so.conf + cache ldconfig |
| Convenção de nomenclatura | lib<nome>.so[.maior[.menor.patch]]; libabc.so é tipicamente um symlink de desenvolvimento → libabc.so.3 → libabc.so.3.1.2 |
| Caminho de busca incorporado | Entradas dinâmicas DT_RPATH ou DT_RUNPATH gravam caminhos de busca de biblioteca no arquivo em tempo de vinculação; DT_RUNPATH é preferido, pois pode ser substituído por LD_LIBRARY_PATH |
| Ferramentas de inspeção | readelf -a, objdump -d, nm --dynamic (binutils); ldd para listagem de dependências; comando file identifica o tipo ELF e a arquitetura |
| Lançado | ELF format 1990s (System V Release 4); .so shared libraries are core to Linux/Unix |
| Padrão aberto | Sim · livre de royalties |
| Especificação | refspecs.linuxfoundation.org |
Conversões de SO
Perguntas e Respostas da Comunidade
perguntado por usuáriosAinda não há perguntas - seja o primeiro a perguntar sobre arquivos SO.