El archivador , también conocido simplemente como ar , es una utilidad Unix que mantiene grupos de archivos como un único archivo comprimido . Hoy en día, ar
generalmente se usa sólo para crear y actualizar archivos de biblioteca estática que usa el editor de enlaces o enlazador y para generar paquetes .deb para la familia Debian ; se puede utilizar para crear archivos para cualquier propósito, pero ha sido reemplazado en gran medida por tar
otros fines además de las bibliotecas estáticas. [3]ar
Se incluye una implementación de GNU Binutils . [2]
En Linux Standard Base (LSB), ar
ha quedado obsoleto y se espera que desaparezca en una versión futura de ese estándar. El fundamento proporcionado fue que "la LSB no incluye utilidades de desarrollo de software ni especifica los formatos de archivo .o y .a". [4]
El formato ar nunca ha sido estandarizado; Los archivos modernos se basan en un formato común con dos variantes principales, BSD y System V (inicialmente conocido como COFF y utilizado también por GNU , ELF y Windows ).
Históricamente ha habido otras variantes [5] incluidas V6 , V7 , AIX (pequeño y grande) y Coherent, que varían significativamente del formato común. [6]
Los archivos Debian ". deb " utilizan el formato común.
Un archivo ar comienza con un encabezado global , seguido de un encabezado y una sección de datos para cada archivo almacenado dentro del archivo ar.
Cada sección de datos está alineada en 2 bytes. Si terminara en un desplazamiento impar, se utiliza una nueva línea ('\n', 0x0A) como relleno.
La firma del archivo es un campo único que contiene la cadena mágica ASCII "!<arch>"
seguida de un único carácter de control LF (0x0A).
Cada archivo almacenado en un archivo ar incluye un encabezado de archivo para almacenar información sobre el archivo. El formato común es el siguiente. Los valores numéricos están codificados en ASCII y todos los valores se rellenan a la derecha con espacios ASCII (0x20).
Como los encabezados solo incluyen caracteres ASCII imprimibles y cambios de línea, un archivo que contiene solo archivos de texto todavía parece ser un archivo de texto en sí mismo.
Los miembros están alineados con límites de bytes pares. "Cada miembro del archivo comprimido comienza en un límite de bytes pares; si es necesario, se inserta una nueva línea entre los archivos. Sin embargo, el tamaño dado refleja el tamaño real del archivo sin incluir el relleno". [7]
Debido a las limitaciones de la longitud y el formato de los nombres de archivos, tanto la variante GNU como la BSD idearon diferentes métodos para almacenar nombres de archivos largos. Aunque el formato común no sufre el problema del año 2038 , muchas implementaciones de la utilidad ar sí lo padecen y es posible que deban modificarse en el futuro para manejar correctamente las marcas de tiempo superiores a 2147483647. Se encuentra una descripción de estas extensiones en libbfd. [8]
Dependiendo del formato, muchas implementaciones de ar incluyen una tabla de símbolos global (también conocida como armap, directorio o índice) para realizar enlaces rápidos sin necesidad de escanear todo el archivo en busca de un símbolo. POSIX reconoce esta característica y requiere que las implementaciones ar tengan una -s
opción para actualizarla. La mayoría de las implementaciones lo colocan en la primera entrada del archivo. [9]
BSD ar almacena nombres de archivos rellenados a la derecha con espacios ASCII. Esto causa problemas con los espacios dentro de los nombres de archivos. 4.4BSD ar almacena nombres de archivos extendidos colocando la cadena "#1/" seguida de la longitud del nombre del archivo en el campo de nombre de archivo y almacenando el nombre de archivo real delante de la sección de datos. [6]
La utilidad BSD ar tradicionalmente no maneja la creación de una tabla de búsqueda de símbolos global y delega esta tarea a una utilidad separada llamada ranlib , [10] que inserta un archivo específico de la arquitectura nombrado __.SYMDEF
como primer miembro del archivo. [11] Algunos descendientes ponen un espacio y "CLASIFICADO" después del nombre para indicar una versión ordenada. [12]__.SYMDEF_64
Existe una variante de 64 bits llamada Darwin .
Sin embargo , desde que POSIX agregó el requisito de la -s
opción como reemplazo de ranlib, las implementaciones BSD ar más nuevas se han reescrito para tener esta característica. FreeBSD en particular abandonó el formato de tabla SYMDEF y adoptó la tabla de estilo System V. [13]
System V ar utiliza un carácter '/' (0x2F) para marcar el final del nombre del archivo; esto permite el uso de espacios sin el uso de un nombre de archivo extendido. Luego almacena varios nombres de archivos extendidos en la sección de datos de un archivo con el nombre "//", los encabezados futuros harán referencia a este registro. Un encabezado hace referencia a un nombre de archivo extendido almacenando un "/" seguido de un desplazamiento decimal al inicio del nombre de archivo en la sección de datos del nombre de archivo extendido. El formato de este archivo "//" en sí es simplemente una lista de nombres de archivo largos, cada uno separado por uno o más caracteres LF. Tenga en cuenta que los desplazamientos decimales son un número de caracteres, no un número de línea o cadena dentro del archivo "//". Esta suele ser la segunda entrada del archivo, después de la tabla de símbolos, que siempre es la primera.
System V ar usa el nombre de archivo especial "/" para indicar que la siguiente entrada de datos contiene una tabla de búsqueda de símbolos, que se usa en las bibliotecas ar para acelerar el acceso. Esta tabla de símbolos está construida en tres partes que se registran juntas como datos contiguos.
Algunos sistemas System V no utilizan el formato descrito anteriormente para la tabla de búsqueda de símbolos. Para sistemas operativos como HP-UX 11.0, esta información se almacena en una estructura de datos basada en el formato de archivo SOM .
El archivo especial "/" no termina con una secuencia específica; el final se asume una vez que se ha leído el nombre del último símbolo.
Para superar el límite de tamaño de archivo de 4 GiB, algunos sistemas operativos como Solaris 11.2 y GNU utilizan una tabla de búsqueda de variantes. En lugar de enteros de 32 bits, se utilizan enteros de 64 bits en las tablas de búsqueda de símbolos. La cadena "/SYM64/" en lugar de "/" se utiliza como identificador para esta tabla [14]
La variante de Windows (PE/COFF) se basa en la variante SysV/GNU. La primera entrada "/" tiene el mismo diseño que la tabla de símbolos SysV/GNU. La segunda entrada es otra "/", una extensión de Microsoft que almacena una tabla extendida de referencias cruzadas de símbolos. Éste está ordenado y utiliza números enteros little-endian. [5] [15] La tercera entrada son los datos de nombre largo opcionales "//" como en SysV/GNU. [16]
La versión de ar
GNU binutils y Elfutils tiene un formato de "archivo delgado" adicional con el número mágico !<thin> . Un archivo ligero solo contiene una tabla de símbolos y referencias al archivo. El formato de archivo es esencialmente un archivo en formato System V donde cada archivo se almacena sin las secciones de datos. Cada nombre de archivo se almacena como un nombre de archivo "largo" y debe resolverse como si fueran enlaces simbólicos . [17]
Para crear un archivo a partir de archivos class1.o , class2.o , class3.o , se usaría el siguiente comando:
ar rcs libclass.a clase1.o clase2.o clase3.o
Los enlazadores de Unix, generalmente invocados a través del compilador de Ccc
, pueden leer ar
archivos y extraer archivos objeto de ellos, por lo que si libclass.a
es un archivo que contiene class1.o
, class2.o
y class3.o
, entonces
cc principal.c libclass.a
o (si libclass.a se coloca en la ruta de la biblioteca estándar, como /usr/local/lib )
cc principal.c -lclass
o (durante la vinculación)
ld... principal.o -lclase...
es lo mismo que:
cc principal.c clase1.o clase2.o clase3.o