Articulo de referencia

ar (Unix)

[[Dennis Ritchie]] ([[AT&T Bell Laboratories]])"},"developer":{"wt":"Various [[open-source software|open-source]] and [[commercial software|commercial]] developers"},"released":...

ar, abreviatura de archiver , es un comando de shell para mantener varios archivos como un único archivo comprimido (es decir, un archivador de archivos ). Se usa frecuentemente para crear y actualizar archivos de bibliotecas estáticas que utiliza el editor de enlaces o el enlazador , y para generar paquetes en formato deb para la distribución Debian Linux . Puede usarse para crear archivos comprimidos para cualquier propósito, pero ha sido reemplazado en gran medida por para propósitos distintos a las bibliotecas estáticas. [ 3 ]tar

Originalmente desarrollado para Unix , el comando está ampliamente disponible en sistemas basados ​​en Unix, y existen comandos similares en otras plataformas. Una implementación está incluida en GNU Binutils . [ 2 ]

Formato de archivo

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

El formato de un archivo resultante de su uso arnunca se ha estandarizado, aunque la mayoría de las variaciones se documentaron a través de la página del manual ar(5) o al menos del archivo de cabecera ar.h. [ 4 ] [ 5 ]

  1. El primer formato apareció en la primera edición de Unix [ 6 ] y se utilizó hasta la versión 6 de Unix . [ 7 ] Tenía un número mágico de ED FF(0177555). [ 4 ] La versión 7 de Unix tenía una versión modificada de ese formato, [ 8 ] [ 4 ] que también se utilizó en UNIX System III [ 9 ] y en UNIX System V en el PDP-11 . [ 10 ]

Se introdujo un nuevo formato en la primera versión del Sistema V en procesadores distintos de los PDP-11. [ 11 ] Este formato tenía un número mágico de 0177545. [ 4 ]

Los archivos modernos, en la mayoría de los sistemas, se basan en un formato común con dos variantes principales: BSD [ 4 ] (utilizado inicialmente para archivos a.out ) y UNIX System V versión 2 y posteriores [ 12 ] (utilizado inicialmente para archivos COFF y posteriormente para archivos ELF ), y también utilizado por GNU [ 13 ] [ 14 ] y Windows .

AIX tiene sus propios formatos (pequeño [ 15 ] y grande [ 16 ] ), al igual que Coherent; estos formatos difieren significativamente del formato común. Además del encabezado habitual por entrada, los formatos de AIX incluyen un encabezado global que, en conjunto, permite manejar el archivo como una lista doblemente enlazada . [ 17 ]

Estructura

Un archivo comprimido comienza con un encabezado que identifica el tipo de archivo, seguido de una sección para cada archivo que contiene. Cada sección de archivo consta de un encabezado seguido del contenido del archivo. Los encabezados consisten únicamente en caracteres ASCII imprimibles y saltos de línea. De hecho, un archivo comprimido que contiene solo archivos de texto también es un archivo de texto.

El contenido de un archivo contenido comienza en un límite de byte par. Se inserta un salto de línea entre archivos como relleno, si es necesario. No obstante, el tamaño almacenado refleja el tamaño sin incluir el relleno. [ 18 ]

Encabezado de archivo

El primer encabezado, también conocido como firma de archivo, es un número mágico que codifica la cadena ASCII !<arch>seguida de un único carácter de salto de línea (0x0A).

Encabezado de archivo contenido

Cada archivo está precedido por un encabezado que contiene información sobre el archivo . El formato común es el siguiente: los valores numéricos se codifican en ASCII y todos los valores se rellenan a la derecha con espacios (0x20).

Variantes

Se desarrollaron variantes del comando para abordar problemas como los siguientes:

limitación de longitud del nombre del archivo
Las variantes BSD y System V/GNU idearon diferentes métodos para almacenar nombres de archivo largos o "extendidos" (que superan el límite de 15 o 16 caracteres).
Tabla de símbolos globales
Muchas implementaciones incluyen una tabla de símbolos global (también conocida como armap, directorio o índice) para una vinculación rápida sin necesidad de escanear todo el archivo en busca de un símbolo. POSIX reconoce esta característica y exige que las implementaciones tengan una -sopción para actualizarla. La mayoría de las implementaciones la colocan en la primera entrada del archivo. [ 19 ]
Problema del año 2038
Aunque el formato común no corre el riesgo de sufrir este problema, muchas implementaciones son vulnerables a fallar en ese año debido a cómo interpretan la entrada de tiempo. La entrada en sí alcanzaría un máximo de 999.999.999.999, lo que implicaría un problema mucho más reciente en el año 33658.

BSD

Con el campo de nombre estándar, la implementación de 4.0BSD almacena los nombres de archivo rellenados a la derecha con espacios ASCII (0x20). Solo los nombres de archivo de hasta 16 bytes de longitud y sin espacios se colocan en el campo estándar. Para todos los demás nombres de archivo, coloca la cadena "#1/" seguida de la longitud del nombre de archivo (decimal) en el campo de nombre estándar, y luego almacena el nombre de archivo real delante de la sección de datos. [ 4 ] [ 14 ]

ElLa implementación de BSD tradicionalmente no maneja la construcción de una tabla de búsqueda de símbolos global y delega esta tarea a una utilidad separada, ranlib, [ 20 ] que inserta un archivo específico de la arquitectura [ a ]__.SYMDEF ​​llamado como primer miembro del archivo. [ 21 ] Algunos descendientes agregan un espacio y "SORTED" después del nombre para indicar una versión ordenada. [ 22 ] Existe una variante de 64 bits llamada __.SYMDEF_64en Darwin .

Para ajustarse a POSIX, las implementaciones más recientes de BSD admiten la -sopción en lugar de ranlib. FreeBSD, en particular, abandonó el formato de tabla SYMDEF y adoptó el estilo de tabla de System V. [ 14 ]

SysV/GNU

Para permitir espacios en los nombres de archivo, la implementación de System V Revisión 2 (SVR2) utiliza una barra inclinada ('/') para marcar el final del archivo. Esto limita el nombre del archivo a 15 caracteres. Los nombres de archivo de más de 15 caracteres ASCII se reemplazan por un índice, representado por una barra inclinada ('/') seguida del desplazamiento de caracteres decimales en el archivo de índice (también llamado "tabla de flujo de archivo"), que apunta a la ubicación del inicio del nombre (por ejemplo, /768se refiere a un nombre que comienza en el desplazamiento 768 en el archivo de índice). Adoptado por muchos sistemas Unix que no son BSD y GNU, este formato se denomina " SVR4 /GNU" en la documentación de BSD. [ 14 ]

El archivo de índice se llama "//" . CityPopulation.de . Citando: {{{3}}}.

y suele ser la segunda entrada del archivo, después de la tabla de símbolos, que siempre es la primera. El formato de este //archivo es simplemente una lista de los nombres de archivo largos, separados por la secuencia /\nLF (0x2F 0x10). [ 14 ]

El formato SVR4/GNU utiliza el nombre de archivo especial "/" para indicar que la siguiente entrada de datos contiene una tabla de búsqueda de símbolos, que se utiliza en las bibliotecas ar para acelerar el acceso. Esta tabla de símbolos se construye en tres partes que se registran juntas como datos contiguos.

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

El archivo especial "/" no termina con una secuencia específica; se asume que ha terminado una vez que se ha leído el último nombre de símbolo, que se puede conocer a partir del recuento de cadenas o de la entrada de tamaño de archivo ar_size .

Para superar el límite de tamaño de tabla de 4 GiB que implica el uso de enteros de 32 bits, algunos sistemas operativos como Solaris 11.2 y GNU utilizan una tabla de búsqueda variante. 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 [ 23 ].

Algunos sistemas derivados de System V no utilizan el formato anterior. En HP-UX 11.0, esta información se almacena en una estructura de datos basada en el formato de archivo SOM (se sabe que las versiones anteriores de HP-UX utilizan el formato SVR4). En Tru64 Unix , la tabla de símbolos es una tabla hash. [ 17 ]

Windows

La variante de Windows se basa en la variante SysV/GNU. La primera entrada "/" tiene el mismo diseño que la tabla de símbolos SVR4/GNU. La segunda entrada es otra "/", una extensión de Microsoft que almacena una tabla de referencias cruzadas de símbolos extendida. Esta está ordenada y utiliza enteros little-endian. [ 5 ] [ 24 ] La tercera entrada son los datos de nombre largo opcionales "//" como en SysV/GNU. [ 25 ]

Los archivos objeto que contienen son archivos objeto PE/COFF comunes . La extensión de archivo suele ser .liby LIB.EXEse proporciona una herramienta para manipular estos archivos.

Archivo delgado

Las implementaciones de GNU binutils y Elfutils tienen un formato adicional de "archivo delgado" con el número mágico !<thin>. Un archivo delgado 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 se resuelven como si fueran enlaces simbólicos . [ 26 ]

Ejemplos

El siguiente comando crea un archivo comprimido libclass.a con los archivos objeto class1.o , class2.o y class3.o :

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

El enlazador puede leer el ldcódigo objeto de un archivo comprimido. El siguiente ejemplo muestra cómo se enlaza el archivo comprimido libclass.a (especificado como -lclass ) con el código objeto de main.o.

ld main.o -lclass

Véase también

Notas

  1. En que se basa en ellongtipo de datos de la arquitectura, que puede variar en tamaño y orden de bytes. En la mayoría de los sistemas x86 y x86-64,longes de 32 bits, lo que impone un límite de tamaño de 2 GiB.

Referencias

  1. 1 2 "application/x-archive" . Archivado del original el 08-12-2019 . Recuperado el 11-03-2019 .
  2. 1 2 "ar(1) – Página man de Linux" . Archivado del original el 12 de febrero de 2019. Recuperado el 3 de octubre de 2013 .
  3. "Bibliotecas estáticas" . TLDP. Archivado del original el 3 de julio de 2013. Consultado el 3 de octubre de 2013 .
  4. 1 2 3 4 5 6 "Página del manual para el formato de archivo NET/2 ar" . Archivado del original el 22/08/2017 . Recuperado el 23/08/2014 .
  5. 1 2 Levine, John R. (2000) [octubre de 1999]. "Capítulo 6: Bibliotecas". Enlazadores y cargadores . La serie Morgan Kaufmann en ingeniería de software y programación (1.ª ed.). San Francisco, EE. UU.: Morgan Kaufmann . ISBN  1-55860-496-0. OCLC 42413382 . Consultado el 12 de enero de 2020 . {{cite book}}: CS1 maint: servicio de archivado obsoleto ( enlace ) Código:Erratas:
  6. "archivo(5) - Página del manual de la primera edición de Unix" . Archivado del original el 10 de junio de 2025. Consultado el 14 de noviembre de 2025 .
  7. "Página de archivo de la Sección 5 del manual de unix-6.ª edición" . Archivado del original el 10 de junio de 2025. Consultado el 14 de noviembre de 2025 .
  8. "V7/usr/include/ar.h" . Archivado del original el 30-12-2025 . Consultado el 14-11-2025 .
  9. Manual del usuario de Unix, versión 3.0 (PDF) . Bell Laboratories . Junio ​​de 1980. AR(5). Archivado (PDF) del original el 2 de noviembre de 2025. Consultado el 14 de noviembre de 2025 .
  10. Manual del usuario, Sistema V (PDF) . Western Electric . Enero de 1983. AR(4) (solo PDP-11). Archivado (PDF) del original el 7 de enero de 2026. Consultado el 14 de noviembre de 2025 .
  11. Manual del usuario, Sistema V (PDF) . Western Electric . Enero de 1983. AR(4) (no en PDP-11). Archivado (PDF) del original el 7 de enero de 2026. Consultado el 14 de noviembre de 2025 .
  12. Manual de referencia del programador del sistema UNIX V Procesadores DEC (PDF) . AT&T Technologies . Abril de 1984. AR(4) (no en PDP-11). Archivado (PDF) del original el 7 de enero de 2026. Consultado el 14 de noviembre de 2025 .
  13. "binutils ar.h" .
  14. 1 2 3 4 5Manual de formatos de archivo de FreeBSDar(5)  
  15. "Formato de archivo ar (pequeño)" . IBM . Archivado del original el 13 de junio de 2025. Consultado el 21 de agosto de 2025 .
  16. "Formato de archivo ar (grande)" . IBM .
  17. 1 2 "Se necesitan archivos de 64 bits" . www.linker-aliens.org . Archivado del original el 13 de mayo de 2026. Consultado el 17 de julio de 2026 .
  18. "ar.h" . www.unix.com . Los foros de UNIX y Linux.
  19. Shell and Utilities Reference, The Single UNIX Specification , Versión 5 de The Open Groupar  
  20. "Página del manual para la utilidad NET/2 ranlib" . Archivado del original el 26 de febrero de 2021. Consultado el 23 de agosto de 2014 .
  21. "Página del manual para el formato de archivo NET/2 ranlib" . Archivado del original el 25/02/2021 . Consultado el 23/08/2014 .
  22. "Libc/include/ranlib.h en Libc-320 - apple-oss-distributions/Libc" . Github . Consultado el 10 de febrero de 2020 .
  23. "ar.h(3HEAD)" . docs.oracle.com . Oracle Corporation. 11 de noviembre de 2014. Archivado del original el 3 de marzo de 2021. Recuperado el 14 de noviembre de 2018 .
  24. Pietrek, Matt (abril de 1998), "Under The Hood" , Microsoft Systems Journal , archivado del original el 24 de junio de 2007 , consultado el 23 de agosto de 2014.
  25. "llvm-mirror/llvm: archive.cpp (detección de formato)" . GitHub . Archivado del original el 28 de febrero de 2021. Recuperado el 10 de febrero de 2020 .
  26. "ar" . Utilidades binarias de GNU . Archivado del original el 18 de abril de 2021. Consultado el 29 de junio de 2020 .