Búsqueda de sitios web

Comprender las bibliotecas compartidas en Linux


En programación, una biblioteca es una variedad de fragmentos de código precompilados que se pueden reutilizar en un programa. Las bibliotecas simplifican la vida de los programadores, ya que proporcionan funciones, rutinas, clases, estructuras de datos, etc. reutilizables (escritos por otro programador), que pueden usar en sus programas.

Por ejemplo, si está creando una aplicación que necesita realizar operaciones matemáticas, no tiene que crear una nueva función matemática para eso, simplemente puede usar funciones existentes en las bibliotecas para ese lenguaje de programación.

Ejemplos de bibliotecas en Linux incluyen libc (la biblioteca C estándar) o Glibc (versión GNU de la biblioteca C estándar), libcurl (archivo multiprotocolo biblioteca de transferencia), libcrypt (biblioteca utilizada para cifrado, hash y codificación en C) y muchos más.

Linux admite dos clases de bibliotecas, a saber:

  • Bibliotecas estáticas: están vinculadas a un programa de forma estática en el momento de la compilación.
  • Bibliotecas dinámicas o compartidas: se cargan cuando se inicia un programa y se carga en la memoria y el enlace se produce en tiempo de ejecución.

Las bibliotecas dinámicas o compartidas se pueden clasificar además en:

  • Bibliotecas vinculadas dinámicamente: aquí un programa está vinculado con la biblioteca compartida y el kernel carga la biblioteca (en caso de que no esté en la memoria) durante la ejecución.
  • Bibliotecas cargadas dinámicamente: el programa toma el control total llamando funciones con la biblioteca.

Convenciones de nomenclatura de bibliotecas compartidas

Las bibliotecas compartidas reciben nombres de dos maneras: el nombre de la biblioteca (también conocido como soname) y un “nombre de archivo” (ruta absoluta al archivo que almacena el código de la biblioteca).

Por ejemplo, el soname para libc es libc.so.6: donde lib es el prefijo, c es un nombre descriptivo, por lo que significa objeto compartido y 6 es la versión. Y su nombre de archivo es: /lib64/libc.so.6. Tenga en cuenta que el soname es en realidad un enlace simbólico al nombre del archivo.

Localización de bibliotecas compartidas en Linux

Las bibliotecas compartidas se cargan mediante ld.so (o ld.so.x) y ld-linux.so (o ld- linux.so.x), donde x es la versión. En Linux, /lib/ld-linux.so.x busca y carga todas las bibliotecas compartidas utilizadas por un programa.

Un programa puede llamar a una biblioteca usando su nombre de biblioteca o nombre de archivo, y una ruta de biblioteca almacena directorios donde se pueden encontrar bibliotecas en el sistema de archivos. De forma predeterminada, las bibliotecas se encuentran en /usr/local/lib, /usr/local/lib64, /usr/lib y /usr/lib64; Las bibliotecas de inicio del sistema están en /lib y /lib64. Sin embargo, los programadores pueden instalar bibliotecas en ubicaciones personalizadas.

La ruta de la biblioteca se puede definir en el archivo /etc/ld.so.conf que puede editar con un editor de línea de comandos.

vi /etc/ld.so.conf 

Las líneas de este archivo indican al kernel que cargue el archivo en /etc/ld.so.conf.d. De esta manera, los programadores o mantenedores de paquetes pueden agregar sus directorios de bibliotecas personalizados a la lista de búsqueda.

Si examina el directorio /etc/ld.so.conf.d, verá archivos .conf para algunos paquetes comunes (kernel, mysql y postgresql en este caso):

ls /etc/ld.so.conf.d

kernel-2.6.32-358.18.1.el6.x86_64.conf  kernel-2.6.32-696.1.1.el6.x86_64.conf  mariadb-x86_64.conf
kernel-2.6.32-642.6.2.el6.x86_64.conf   kernel-2.6.32-696.6.3.el6.x86_64.conf  postgresql-pgdg-libs.conf

Si echa un vistazo a mariadb-x86_64.conf, verá una ruta absoluta a las bibliotecas de paquetes.

cat mariadb-x86_64.conf

/usr/lib64/mysql

El método anterior establece la ruta de la biblioteca de forma permanente. Para configurarlo temporalmente, use la variable de entorno LD_LIBRARY_PATH en la línea de comando. Si desea mantener los cambios permanentes, agregue esta línea en el archivo de inicialización del shell /etc/profile (global) o ~/.profile (específico del usuario).

export LD_LIBRARY_PATH=/path/to/library/file

Gestión de bibliotecas compartidas en Linux

Veamos ahora cómo lidiar con las bibliotecas compartidas. Para obtener una lista de todas las dependencias de bibliotecas compartidas para un archivo binario, puede utilizar la utilidad ldd. La salida de ldd tiene el formato:

library name =>  filename (some hexadecimal value)
OR
filename (some hexadecimal value)  #this is shown when library name can’t be read

Este comando muestra todas las dependencias de bibliotecas compartidas para el comando ls.

ldd /usr/bin/ls
OR
ldd /bin/ls
Salida de muestra
	linux-vdso.so.1 =>  (0x00007ffebf9c2000)
	libselinux.so.1 => /lib64/libselinux.so.1 (0x0000003b71e00000)
	librt.so.1 => /lib64/librt.so.1 (0x0000003b71600000)
	libcap.so.2 => /lib64/libcap.so.2 (0x0000003b76a00000)
	libacl.so.1 => /lib64/libacl.so.1 (0x0000003b75e00000)
	libc.so.6 => /lib64/libc.so.6 (0x0000003b70600000)
	libdl.so.2 => /lib64/libdl.so.2 (0x0000003b70a00000)
	/lib64/ld-linux-x86-64.so.2 (0x0000561abfc09000)
	libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003b70e00000)
	libattr.so.1 => /lib64/libattr.so.1 (0x0000003b75600000)

Debido a que las bibliotecas compartidas pueden existir en muchos directorios diferentes, buscar en todos estos directorios cuando se inicia un programa sería muy ineficiente: lo cual es una de las probables desventajas de las bibliotecas dinámicas. Por lo tanto se emplea un mecanismo de almacenamiento en caché, realizado por el programa ldconfig.

De forma predeterminada, ldconfig lee el contenido de /etc/ld.so.conf, crea los enlaces simbólicos apropiados en los directorios de enlaces dinámicos y luego escribe un caché en /etc/ld.so.cache que luego otros programas pueden utilizar fácilmente.

Esto es muy importante, especialmente cuando acaba de instalar nuevas bibliotecas compartidas, ha creado las suyas propias o ha creado nuevos directorios de bibliotecas. Debe ejecutar el comando ldconfig para efectuar los cambios.

ldconfig
OR
ldconfig -v 	#shows files and directories it works with

Después de crear su biblioteca compartida, debe instalarla. Puede moverlo a cualquiera de los directorios estándar mencionados anteriormente y ejecutar el comando ldconfig.

Alternativamente, ejecute el siguiente comando para crear enlaces simbólicos desde el soname al nombre del archivo:

ldconfig -n /path/to/your/shared/libraries

Para comenzar a crear sus propias bibliotecas, consulte esta guía de The Linux Documentation Project (TLDP).

¡Eso es todo por ahora! En este artículo, le brindamos una introducción a las bibliotecas y le explicamos las bibliotecas compartidas y cómo administrarlas en Linux. Si tiene alguna consulta o idea adicional para compartir, utilice el formulario de comentarios a continuación.