ar (Unix) - ar (Unix)

ar
Autor (es) original (is) Ken Thompson ,
Dennis Ritchie
( AT&T Bell Laboratories )
Desenvolvedor (s) Vários open-source e comerciais desenvolvedores
lançamento inicial 3 de novembro de 1971 ; 49 anos atrás ( 1971-11-03 )
Sistema operacional Unix , semelhante ao Unix , V , Plan 9 , Inferno
Plataforma Plataforma cruzada
Modelo Comando
formato de arquivador
Extensão de nome de arquivo
.a , .lib , .ar
Tipo de mídia da Internet
aplicativo / x-archive
número mágico ! <arch>
Tipo de formato formato de arquivo
Recipiente para geralmente arquivos de objeto ( .o , .obj )
Padrão Não padronizado, existem várias variantes
Formato aberto ? sim

O arquivador , também conhecido simplesmente como ar , é um utilitário Unix que mantém grupos de arquivos como um único arquivo . Hoje, argeralmente é usado apenas para criar e atualizar arquivos de biblioteca estática que o editor de link ou vinculador usa e para gerar pacotes .deb para a família Debian ; ele pode ser usado para criar arquivos para qualquer propósito, mas foi amplamente substituído por taroutros propósitos além de bibliotecas estáticas. Uma implementação de arestá incluída como um dos GNU Binutils .

No Linux Standard Base (LSB), arfoi descontinuado e deve desaparecer em uma versão futura desse padrão. A justificativa fornecida foi que "o LSB não inclui utilitários de desenvolvimento de software nem especifica os formatos de arquivo .o e .a".

Detalhes do formato do arquivo

Diagrama mostrando um exemplo de estrutura de arquivo de um arquivo .deb

O formato ar nunca foi padronizado; arquivos modernos são baseados em um formato comum com duas variantes principais, BSD e System V (inicialmente conhecido como COFF , e também usado por GNU , ELF e Windows ).

Historicamente, houve outras variantes, incluindo V6 , V7 , AIX (pequeno e grande) e Coherent, que variam significativamente do formato comum.

Os arquivos Debian ". Deb " usam o formato comum.

Um arquivo ar começa com um cabeçalho global , seguido por um cabeçalho e uma seção de dados para cada arquivo armazenado no arquivo ar.

Cada seção de dados é alinhada por 2 bytes. Se terminasse em um deslocamento ímpar, uma nova linha ('\ n', 0x0A) é usada como preenchimento.

Assinatura de arquivo

A assinatura do arquivo é um único campo contendo a string ASCII mágica "!<arch>" seguida por um único caractere de controle LF (0x0A).

Cabeçalho do arquivo

Cada arquivo armazenado em um arquivo AR inclui um cabeçalho de arquivo para armazenar informações sobre o arquivo. O formato comum é o seguinte. Os valores numéricos são codificados em ASCII e todos os valores preenchidos à direita com espaços ASCII (0x20).

Desvio Comprimento Nome Formato
0 16 Identificador de arquivo ASCII
16 12 Carimbo de data e hora de modificação do arquivo (em segundos) Decimal
28 6 ID do proprietário Decimal
34 6 ID do grupo Decimal
40 8 Modo de arquivo (tipo e permissão) Octal
48 10 Tamanho do arquivo em bytes Decimal
58 2 Personagens finais 0x60 0x0A

Como os cabeçalhos incluem apenas caracteres ASCII imprimíveis e avanços de linha, um arquivo contendo apenas arquivos de texto, portanto, ainda parece ser um arquivo de texto em si.

Os membros são alinhados aos limites de bytes iguais. "Cada membro do arquivo começa em um limite de byte uniforme; uma nova linha é inserida entre os arquivos, se necessário. No entanto, o tamanho fornecido reflete o tamanho real do arquivo sem o preenchimento."

Devido às limitações de comprimento e formato do nome do arquivo, as variantes GNU e BSD desenvolveram métodos diferentes de armazenamento de nomes longos de arquivos. Embora o formato comum não sofra com o problema do ano 2038 , muitas implementações do utilitário ar sofrem e podem precisar ser modificadas no futuro para lidar com carimbos de data / hora corretos acima de 2147483647. Uma descrição dessas extensões é encontrada em libbfd.

Dependendo do formato, muitas implementações de ar incluem uma tabela de símbolos global (também conhecida como armap, diretório ou índice) para links rápidos sem a necessidade de examinar todo o arquivo em busca de um símbolo. POSIX reconhece esse recurso e requer que as implementações de ar tenham uma -sopção para atualizá-lo. A maioria das implementações o coloca na primeira entrada do arquivo.

Variante BSD

BSD ar armazena nomes de arquivos preenchidos à direita com espaços ASCII. Isso causa problemas com espaços dentro dos nomes dos arquivos. 4.4BSD ar armazena nomes de arquivos estendidos colocando a string "# 1 /" seguida pelo comprimento do nome do arquivo no campo do nome do arquivo, e armazenando o nome do arquivo real na frente da seção de dados.

O utilitário BSD ar tradicionalmente não lida com a construção de uma tabela de pesquisa de símbolo global e delega essa tarefa a um utilitário separado chamado ranlib , que insere um arquivo específico da arquitetura nomeado __.SYMDEFcomo o primeiro membro do arquivo. Alguns descendentes colocam um espaço e "SORTED" após o nome para indicar uma versão classificada. Uma variante de 64 bits chamada __.SYMDEF_64existe no Darwin .

Desde que POSIX adicionou o requisito para a -sopção como um substituto do ranlib, no entanto, as novas implementações BSD ar foram reescritas para ter esse recurso. O FreeBSD em particular abandonou o formato de tabela SYMDEF e adotou a tabela de estilo System V.

Variante do sistema V (ou GNU)

System V ar usa um caractere '/' (0x2F) para marcar o final do nome do arquivo; isso permite o uso de espaços sem o uso de um nome de arquivo estendido. Em seguida, ele armazena vários nomes de arquivos estendidos na seção de dados de um arquivo com o nome "//", esse registro é referido por cabeçalhos futuros. Um cabeçalho faz referência a um nome de arquivo estendido armazenando um "/" seguido por um deslocamento decimal para o início do nome do arquivo na seção de dados do nome de arquivo estendido. O formato deste arquivo "//" em si é simplesmente uma lista de nomes de arquivo longos, cada um separado por um ou mais caracteres LF. Observe que os deslocamentos decimais são números de caracteres, não números de linha ou string no arquivo "//". Normalmente é a segunda entrada do arquivo, depois da tabela de símbolos, que é sempre a primeira.

System V ar usa o nome de arquivo especial "/" para denotar que a seguinte entrada de dados contém uma tabela de pesquisa de símbolo, que é usada em bibliotecas AR para acelerar o acesso. Esta tabela de símbolos é construída em três partes que são registradas juntas como dados contíguos.

  1. Um inteiro big endian de 32 bits, fornecendo o número de entradas na tabela.
  2. Um conjunto de inteiros big endian de 32 bits. Um para cada símbolo, registrando a posição dentro do arquivo do cabeçalho do arquivo que contém este símbolo.
  3. Um conjunto de strings terminadas em zero. Cada um é um nome de símbolo e ocorre na mesma ordem que a lista de posições na parte 2.

Alguns sistemas System V não usam o formato descrito acima para a tabela de pesquisa de símbolos. Para sistemas operacionais como HP-UX 11.0, essas informações são armazenadas em uma estrutura de dados baseada no formato de arquivo SOM .

O arquivo especial "/" não termina com uma seqüência específica; o fim é assumido assim que o último nome do símbolo for lido.

Para superar o limite de tamanho de arquivo de 4 GiB, alguns sistemas operacionais como Solaris 11.2 e GNU usam uma tabela de pesquisa de variantes. Em vez de inteiros de 32 bits, inteiros de 64 bits são usados ​​nas tabelas de pesquisa de símbolo. A string "/ SYM64 /" em vez de "/" é usada como identificador para esta tabela

Variante do Windows

A variante do Windows (PE / COFF) é baseada na variante SysV / GNU. A primeira entrada "/" tem o mesmo layout da tabela de símbolos SysV / GNU. A segunda entrada é outra "/", uma extensão ECOFF da Microsoft que armazena uma tabela de referência cruzada de símbolo estendida. Este é classificado e usa inteiros little-endian. A terceira entrada são os dados de nome longo "//" opcionais como em SysV / GNU.

Arquivo fino

A versão arem GNU binutils e Elfutils tem um formato adicional de "arquivo fino" com o número mágico ! <thin> . Um arquivo thin contém apenas uma tabela de símbolos e referências ao arquivo. O formato do arquivo é essencialmente um arquivo no formato System V, onde cada arquivo é armazenado sem as seções de dados. Cada nome de arquivo é armazenado como um nome de arquivo "longo" e eles devem ser resolvidos como se fossem links simbólicos .

Exemplo de uso

Para criar um arquivo a partir dos arquivos class1.o , class2.o , class3.o , o seguinte comando seria usado:

ar rcs libclass.a class1.o class2.o class3.o

Os vinculadores Unix, geralmente invocados através do compilador Ccc , podem ler ararquivos e extrair arquivos objeto deles, portanto, se libclass.aé um arquivo contendo class1.o, class2.oe class3.o, então

cc main.c libclass.a

ou (se libclass.a for colocado no caminho da biblioteca padrão, como / usr / local / lib )

cc main.c -lclass

ou (durante a vinculação)

ld ... main.o -lclass ...

é o mesmo que:

cc main.c class1.o class2.o class3.o

Veja também

Referências

links externos