Entendiendo las bibliotecas compartidas en Linux


En programación, una biblioteca es una variedad de piezas de código precompiladas que pueden reutilizarse en un programa. Las bibliotecas simplifican la vida de los programadores, ya que proporcionan funciones reutilizables, rutinas, clases, estructuras de datos, etc. (escritas por otro programador), que pueden utilizar 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 las funciones existentes en las bibliotecas para ese lenguaje de programación.

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

Linux soporta dos clases de bibliotecas, a saber:

  • Static libraries – are bound to a program statically at compile time.
  • Dynamic or shared libraries – are loaded when a program is launched and loaded into memory and binding occurs at run time.

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

  • Dynamically linked libraries – here a program is linked with the shared library and the kernel loads the library (in case it’s not in memory) upon execution.
  • Dynamically loaded libraries – the program takes full control by calling functions with the library.

Las bibliotecas compartidas se nombran de dos maneras: el nombre de la biblioteca (a.k.a soname ) y un "nombre de archivo" (ruta absoluta al archivo que almacena el código de la biblioteca).

Por ejemplo, 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 de archivo.

Las bibliotecas compartidas se cargan con 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 los directorios donde se pueden encontrar las 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 

La (s) línea (s) en este archivo le indica al núcleo que cargue el archivo en /etc/ld.so.conf.d . De esta manera, los mantenedores de paquetes o los programadores pueden agregar sus directorios de biblioteca personalizados a la lista de búsqueda.

Si observa el directorio /etc/ld.so.conf.d , verá los 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 comandos. Si desea mantener los cambios de forma permanente, agregue esta línea en el archivo de inicialización de shell /etc/profile (global) o ~/.profile (específico del usuario).

# export LD_LIBRARY_PATH=/path/to/library/file

Veamos ahora cómo tratar con 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 está en 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: es una de las desventajas probables de las bibliotecas dinámicas. Por lo tanto, un mecanismo de almacenamiento en caché empleado por un programa ldconfig .

De forma predeterminada, ldconfig lee el contenido de /etc/ld.so.conf , crea los enlaces simbólicos adecuados 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 o de crear las suyas propias, o de crear 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, necesita 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 soname al nombre de 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, use el formulario de comentarios a continuación.