Comprensión de las bibliotecas compartidas en Linux


En programación, una biblioteca es una variedad de piezas de código precompiladas que se pueden reutilizar en un programa. Las bibliotecas simplifican la vida de los programadores, ya que proporcionan funciones, rutinas, clases, estructuras de datos reutilizables, etc. (escritas 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 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 (biblioteca de transferencia de archivos multiprotocolo), 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 la vinculación se produce en tiempo de ejecución.

Las bibliotecas dinámicas o compartidas se pueden clasificar 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) al ejecutarse.
  • Bibliotecas cargadas dinámicamente: el programa toma el control total llamando a funciones con la biblioteca.

Las bibliotecas compartidas se nombran 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 nombre de 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.

Las bibliotecas compartidas las cargan los programas 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. Por defecto, 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 núcleo que cargue el archivo en /etc/ld.so.conf.d. De esta manera, los encargados del mantenimiento de paquetes o los programadores pueden agregar sus directorios de bibliotecas personalizadas a la lista de búsqueda.

Si busca en 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 del paquete.

# 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

Veamos ahora cómo tratar las bibliotecas compartidas. Para obtener una lista de todas las dependencias de bibliotecas compartidas para un archivo binario, puede usar la utilidad ldd. La salida de ldd tiene la forma:

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 la biblioteca compartida para el comando ls.

# ldd /usr/bin/ls
OR
# ldd /bin/ls
	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, la búsqueda 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 es usado fácilmente por otros programas .

Esto es muy importante, especialmente cuando acaba de instalar nuevas bibliotecas compartidas o ha creado la suya propia, o ha creado nuevos directorios de bibliotecas. Necesita 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 del soname al nombre del archivo:

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

Para comenzar a crear sus propias bibliotecas, consulte esta guía del Proyecto de documentación de Linux (TLDP).

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