que es ranlib

13

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!

Ying
fuente

Respuestas:

7

ranlibagrega o actualiza archivos de objetos en una biblioteca estática . Los vinculadores pueden usar bibliotecas estáticas cuando se vinculan para proporcionar símbolos que el código necesita para funcionar (en lugar de que el cargador los busque en bibliotecas dinámicas cuando ejecuta el ejecutable).

Ignacio Vazquez-Abrams
fuente
Hola Ignacio, gracias por la respuesta. ¿Significa esto que si ejecuto ranlib en una biblioteca, estará disponible para su uso cada vez que un vinculador intente 'referenciarlo'? ¿Cómo se elimina?
Ying
ranlibse 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 -Ly -la gcc para más detalles.
Ignacio Vazquez-Abrams
55
¿Pero no hace eso artambién? ¿Cual es la diferencia?
greatwolf
18

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:

$ ar r fruits.a apple.o orange.o pineapple.o

Entonces corriendo

$ ranlib fruits.a

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

Guest McGuesterson
fuente
"ranlib genera un índice de los contenidos de un archivo y lo almacena en el archivo". Esto suena más como algo para combinar tary yo diría que no está muy claro.
Codebling
9

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

Albert
fuente
2

Arkansas

En Linux, ares el archivador de propósito general GNU. (Hay variantes que no son GNU aren otros sistemas operativos tipo Unix). Con la opcionc

ar c... archive-name file...

Crea un archivo que contiene copias de file.... El archive-nameconvencional pero no necesariamente tiene la extensión .a(para archivo ). Cada uno file...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 prefijo lib, por ejemplo libfoo.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.anormalmente 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 archivo libfoo.aes casi el mismo tipo de DSO libfoo.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 arhace 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 propio arejemplo, y también con la opción (capital) S(= sin tabla de símbolos ). Y si invoca arpara crear o actualizar un archivo que no tiene una tabla de símbolos (actualizada) por algún motivo, puede darle uno con la sopción.

ranlib

ranlibno crea bibliotecas en absoluto. En Linux, ranlibes un programa heredado que agrega una tabla de símbolos (actualizada) a un ararchivo si no tiene una. Su efecto es exactamente el mismo que ar scon GNU ar. Históricamente, antes arestaba equipado para generar una tabla de símbolos en sí, ranlibera 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, ranlibaún podría ser necesario para este propósito. Su ejemplo:

ar qc libgraphics.a *.o
ranlib libgraphics.a

dice:

  • Cree libgraphics.aagregando a un archivo todos los *.oarchivos en el directorio actual, sin tabla de símbolos.
  • Luego agregue una tabla de símbolos a libgraphics.a

En Linux, esto tiene el mismo efecto neto que:

ar cr libgraphics.a *.o

Por sí mismo, ar qc libgraphics.a *.ocrea un archivo que el enlazador no puede usar, porque no tiene una tabla de símbolos.

ld

Su ejemplo:

ld -r -o libgraphics.a *.o

En realidad es bastante poco ortodoxo. Esto ilustra el uso bastante raro del enlazador , ldpara 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 un ar archivo , y especificar un nombre de archivo de salida que se parece al de un ararchivo no lo convierte en uno. Entonces su ejemplo ilustra un engaño. Esta:

ld -r -o graphics.o *.o

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.aa 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 un ararchivo, 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:

gcc -o prog file.o ... -Ldir ... -lfoo ...

Vinculación de un DSO:

gcc -shared -o libbar.so file.o ... -Ldir ... -lfoo ...

Tanto las bibliotecas compartidas como las bibliotecas estáticas se pueden ofrecer al enlazador mediante el -lfooprotocolo 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 encontrar libfoo.soo libfoo.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. Si libfoo.sose selecciona, el enlazador agrega ese DSO a la lista de dependencias de tiempo de ejecución de cualquier programa o DSO que esté haciendo. Si libfoo.ase 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 en libfoo.así 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 .

Royi
fuente