He estado usando un sistema MacOSX por un tiempo, pero solo recientemente comencé a hurgar en las entrañas. Encontré una guía que me decía que ejecutara 'sudo ranlib /usr/local/lib/libjpeg.a'(installing libjpeg). Leí el manual de ranlib e intenté buscarlo en línea. Simplemente no entiendo. ¿Qué recursos necesito buscar para obtener más información, o alguien puede dar una explicación concisa sobre su uso? ¡Gracias por adelantado!
13
ranlib
se usa para crear y modificar las bibliotecas. Depende del enlazador usarlos, generalmente pasando la ubicación de la biblioteca y / o el nombre en la línea de comando. Vea los argumentos-L
y-l
a gcc para más detalles.ar
también? ¿Cual es la diferencia?Esta descripción parece bastante clara: http://sourceware.org/binutils/docs/binutils/ranlib.html
Entonces, si archiva una colección de archivos de objetos, diga:
Entonces corriendo
crea un índice de los contenidos de fruits.a y almacena el índice en fruits.a. Esto es útil para vincular y en caso de que los objetos se llamen entre sí.
fuente
tar
y yo diría que no está muy claro.ranlib genera un índice de los contenidos de un archivo y lo almacena en el archivo. El índice enumera cada símbolo definido por un miembro de un archivo que es un archivo de objeto reubicable. Un archivo con dicho índice acelera el enlace a la biblioteca y permite que las rutinas en la biblioteca se llamen entre sí sin tener en cuenta su ubicación en el archivo.
fuente: página man de ranlib
fuente
Arkansas
En Linux,
ar
es el archivador de propósito general GNU. (Hay variantes que no son GNUar
en otros sistemas operativos tipo Unix). Con la opcionc
Crea un archivo que contiene copias de
file...
. Elarchive-name
convencional pero no necesariamente tiene la extensión.a
(para archivo ). Cada unofile...
puede ser cualquier tipo de archivo, no necesariamente un archivo objeto.Cuando los archivos archivados son todos archivos de objeto, generalmente es la intención usar el archivo para entregar esa selección de archivos de objeto en el enlace de programas o DSO (Objetos dinámicos compartidos). En este caso
archive-name
, también se le dará convencionalmente el prefijolib
, por ejemplolibfoo.a
, para que pueda descubrirse como un archivo de entrada de enlazador candidato a través de la opción de enlazador-lfoo
.Usado como un archivo de entrada del enlazador,
libfoo.a
normalmente se llama biblioteca estática . Este uso es una fuente perpetua de confusión para los programadores inexpertos, porque los lleva a pensar que un archivolibfoo.a
es casi el mismo tipo de DSOlibfoo.so
, normalmente llamado biblioteca dinámica / compartida , y a construir falsas expectativas sobre esta base. De hecho, una "biblioteca estática" y una "biblioteca dinámica" no son en absoluto cosas similares y se usan en vinculación de maneras completamente diferentes.Una diferencia notable es que una biblioteca estática no es producida por el enlazador , sino por
ar
. Por lo tanto, no se produce un enlace, no se produce una resolución de símbolo Los archivos de objetos archivados no cambian: solo se guardan en una bolsa.Cuando un archivo se introduce en la vinculación de algo que se produce por el enlazador - tales como un programa o DSO - las miradas de engarce en la bolsa para ver si hay algún archivo de objeto en lo que proporcionan las definiciones de referencias a los símbolos no resueltos que se han acumulado anteriormente en el enlace. Si encuentra alguno, extrae los archivos objeto de la bolsa y vincula ellos en el archivo de salida, exactamente como si ellos fueron nombrados individualmente en la línea de comandos enlazador y el archivo no se mencionan en absoluto. Por lo tanto, la función completa de un archivo en el enlace es como una bolsa de archivos de objetos desde los cuales el enlazador puede seleccionar los que necesita para llevar el enlace.
Por defecto, GNU
ar
hace que sus archivos de salida estén listos para usar como entradas de enlace. Agrega un "archivo" falso al archivo, con un nombre de archivo falso mágico, y en este archivo falso escribe contenido que el enlazador puede leer como una tabla de búsqueda de los símbolos globales definidos por cualquier archivo de objeto en el archivo a los nombres y posiciones de esos archivos de objetos en el archivo. Esta tabla de búsqueda es lo que permite que el enlazador busque en el archivo e identifique cualquier archivo de objeto que defina cualquier referencia de símbolo sin resolver que tenga disponible.Puede suprimir la creación o actualización de esta tabla de búsqueda con la opción
q
(= rápida ), que de hecho ha utilizado en su propioar
ejemplo, y también con la opción (capital)S
(= sin tabla de símbolos ). Y si invocaar
para crear o actualizar un archivo que no tiene una tabla de símbolos (actualizada) por algún motivo, puede darle uno con las
opción.ranlib
ranlib
no crea bibliotecas en absoluto. En Linux,ranlib
es un programa heredado que agrega una tabla de símbolos (actualizada) a unar
archivo si no tiene una. Su efecto es exactamente el mismo quear s
con GNUar
. Históricamente, antesar
estaba equipado para generar una tabla de símbolos en sí,ranlib
era el error que inyectaba el archivo falso mágico en un archivo para permitir que el vinculador seleccionara archivos de objetos. En sistemas operativos que no sean GNU similares a Unix,ranlib
aún podría ser necesario para este propósito. Su ejemplo:dice:
libgraphics.a
agregando a un archivo todos los*.o
archivos en el directorio actual, sin tabla de símbolos.libgraphics.a
En Linux, esto tiene el mismo efecto neto que:
Por sí mismo,
ar qc libgraphics.a *.o
crea un archivo que el enlazador no puede usar, porque no tiene una tabla de símbolos.ld
Su ejemplo:
En realidad es bastante poco ortodoxo. Esto ilustra el uso bastante raro del enlazador ,
ld
para producir un archivo de objeto combinado al vincular múltiples archivos de entrada en un solo archivo de objeto de salida, en el que la resolución de símbolos se ha realizado en la medida de lo posible , dados los archivos de entrada. La opción-r
(= reubicable ) dirige al vinculador para que produzca un objetivo de archivo de objeto (en lugar de un programa o DSO) al vincular las entradas lo más posible y no fallar el enlace si las referencias de símbolos indefinidas permanecen en el archivo de salida. Este uso se llama enlace parcial .El archivo de salida de
ld -r ...
es un archivo de objeto, no unar
archivo , y especificar un nombre de archivo de salida que se parece al de unar
archivo no lo convierte en uno. Entonces su ejemplo ilustra un engaño. Esta:Sería sincero. No está claro para mí cuál podría ser el propósito de tal engaño, porque incluso si se llama
libgraphics.a
a un archivo de objeto ELF y se ingresa a un enlace ya sea por ese nombre o por-lgraphics
, el vinculador lo identificará correctamente como un archivo de objeto ELF , no unar
archivo, y lo consumirá de la misma manera que consume cualquier archivo de objeto en la línea de comandos: lo vincula incondicionalmente al archivo de salida, mientras que el punto de ingresar un archivo genuino es vincular a los miembros del archivo solo con la condición de que sean referenciados . Quizás solo tenga un ejemplo de enlaces mal informados aquí.Terminando...
En realidad, solo hemos visto una forma de producir algo que convencionalmente se llama biblioteca , y esa es la producción de una llamada biblioteca estática , archivando algunos archivos de objetos y colocando una tabla de símbolos en el archivo.
Y no hemos visto en absoluto cómo producir el otro tipo de cosa más importante que convencionalmente se llama biblioteca , es decir, un objeto compartido dinámico / biblioteca compartida / biblioteca dinámica.
Al igual que un programa, el enlazador produce un DSO . Un programa y un DSO son variantes del binario ELF que el cargador del sistema operativo entiende y puede usar para ensamblar un proceso en ejecución. Por lo general, se invoca el enlazador a través de una una de las interfaces del CCG (
gcc
,g++
,gfortran
, etc.):Vinculación de un programa:
Vinculación de un DSO:
Tanto las bibliotecas compartidas como las bibliotecas estáticas se pueden ofrecer al enlazador mediante el
-lfoo
protocolo uniforme , cuando está vinculando algún otro programa o DSO. Esa opción dirige al vinculador a escanear sus directorios de búsqueda especificados o predeterminados para encontrarlibfoo.so
olibfoo.a
. Por defecto, una vez que encuentre uno de ellos, ingresará ese archivo en el enlace, y si encuentra ambos en el mismo directorio de búsqueda, lo preferirálibfoo.so
. Silibfoo.so
se selecciona, el enlazador agrega ese DSO a la lista de dependencias de tiempo de ejecución de cualquier programa o DSO que esté haciendo. Silibfoo.a
se selecciona, el vinculador utiliza el archivo como una selección de archivos de objetos para vincularlos al archivo de salida, si es necesario, allí mismo. Sin dependencia del tiempo de ejecución enlibfoo.a
sí mismo es posible; no puede mapearse en un proceso; no significa nada para el cargador del sistema operativo.Copiado de https://stackoverflow.com/a/47924864/195787 .
fuente