stringtranslate.com

ar (Unix)

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, argeneralmente 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 tarotros fines además de las bibliotecas estáticas. [3]ar Se incluye una implementación de GNU Binutils . [2]

En Linux Standard Base (LSB), arha 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]

Detalles del formato de archivo

Diagrama que muestra una estructura de archivo de ejemplo de un archivo .deb

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.

Firma del archivo

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).

encabezado de archivo

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 -sopción para actualizarla. La mayoría de las implementaciones lo colocan en la primera entrada del archivo. [9]

variante BSD

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 __.SYMDEFcomo 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 -sopció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]

Variante del Sistema V (o GNU)

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.

  1. Un entero big endian de 32 bits que indica el número de entradas de la tabla.
  2. Un conjunto de enteros big endian de 32 bits. Uno para cada símbolo, registrando la posición dentro del archivo del encabezado del archivo que contiene este símbolo.
  3. Un conjunto de cadenas terminadas en cero. Cada uno es el nombre de un símbolo y aparece en el mismo orden que la lista de posiciones en la parte 2.

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]

variante de Windows

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]

Archivo delgado

La versión de arGNU 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]

Uso de ejemplo

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 ararchivos y extraer archivos objeto de ellos, por lo que si libclass.aes un archivo que contiene class1.o, class2.oy 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

Ver también

Referencias

  1. ^ ab "aplicación/archivo x". Archivado desde el original el 8 de diciembre de 2019 . Consultado el 11 de marzo de 2019 .
  2. ^ ab "ar(1) - página de manual de Linux" . Consultado el 3 de octubre de 2013 .
  3. ^ "Bibliotecas estáticas". TLDP . Consultado el 3 de octubre de 2013 .
  4. ^ Especificación básica básica estándar de Linux, versión 4.1, Capítulo 15. Comandos y utilidades> ar
  5. ^ ab Levine, John R. (2000) [octubre de 1999]. "Capítulo 6: Bibliotecas". Enlazadores y cargadores. La serie Morgan Kaufmann sobre programación e ingeniería de software (1 ed.). San Francisco, Estados Unidos: Morgan Kaufmann . ISBN 1-55860-496-0. OCLC  42413382. Archivado desde el original el 5 de diciembre de 2012 . Consultado el 12 de enero de 2020 .Código: [1][2] Fe de erratas: [3]
  6. ^ ab Página del manual para el formato de archivo NET/2 ar
  7. ^ "arh". www.unix.com . Los foros de UNIX y Linux.
  8. ^ "bminor/binutils-gdb: archive.c". GitHub . 16 de julio de 2022.
  9. ^ ar  - Referencia de Shell y utilidades, la especificación única de UNIX , versión 4 de The Open Group
  10. ^ Página del manual de la utilidad ranlib NET/2
  11. ^ Página de manual para el formato de archivo ranlib NET/2
  12. ^ "ranlib.h". opensource.apple.com .
  13. ^ ar(5)  -  Manual de formatos de archivos de FreeBSD
  14. ^ "arh ​​(3HEAD)". docs.oracle.com . Corporación Oráculo. 11 de noviembre de 2014 . Consultado el 14 de noviembre de 2018 .
  15. ^ Pietrek, Matt (abril de 1998), "Under The Hood", Microsoft Systems Journal , archivado desde el original el 24 de junio de 2007 , consultado el 23 de agosto de 2014
  16. ^ "llvm-mirror/llvm: archive.cpp (detección de formato)". GitHub . Consultado el 10 de febrero de 2020 .
  17. ^ "ar". Utilidades binarias GNU .

Enlaces externos