Comprender las bibliotecas compartidas en Linux

Comprender las bibliotecas compartidas en Linux

En la 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 reutilizables, rutinas, clases, estructuras de datos, etc. (escritas por otro programador), que pueden usar en sus programas.

Por ejemplo, si está creando una aplicación que necesita realizar operaciones de 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 C estándar) o Glibc (Versión GNU de la biblioteca C estándar), libcurl (Biblioteca de transferencia de archivos multiprotocol), librypt (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 vinculados a un programa estáticamente 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 se produce el enlace en el tiempo de ejecución.

Las bibliotecas dinámicas o compartidas se pueden clasificar aún más en:

  • Bibliotecas vinculadas dinámicamente - Aquí un programa está vinculado con la biblioteca compartida y el núcleo carga la biblioteca (en caso de que no esté en memoria) al ejecutar.
  • Bibliotecas cargadas dinámicamente - El programa toma el control total llamando a las funciones con la biblioteca.

Convenciones de nombres de la biblioteca compartida

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

Por ejemplo, el soname para libc es libc.entonces.6: dónde lib es el prefijo, C es un nombre descriptivo, así que significa objeto compartido, y 6 es la versión. Y su nombre de archivo es: /lib64/libc.entonces.6. Tenga en cuenta que el soname es en realidad un enlace simbólico al nombre de archivo.

Localización de bibliotecas compartidas en Linux

Las bibliotecas compartidas están cargadas por ld.entonces (o ld.entonces.X) y ld-linux.entonces (o ld-linux.entonces.X) programas, donde X es la versión. En Linux, /lib/ld-linux.entonces.X Búsqueda y carga todas las bibliotecas compartidas utilizadas por un programa.

Un programa puede llamar a una biblioteca utilizando el nombre de su biblioteca o nombre de archivo, y una ruta de la biblioteca almacena directorios donde las bibliotecas se pueden encontrar 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 /etc/ld.entonces.confusión Archivo que puede editar con un editor de línea de comandos.

# vi /etc /ld.entonces.confusión 

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

Si miras el /etc/ld.entonces.confusión.d directorio, verás .confusión archivos para algunos paquetes comunes (kernel, mysql y postgreSQL en este caso):

# ls /etc /ld.entonces.confusión.d núcleo-2.6.32-358.18.1.El6.x86_64.conf núcleo-2.6.32-696.1.1.El6.x86_64.conf mariadb-x86_64.conf núcleo-2.6.32-642.6.2.El6.x86_64.conf núcleo-2.6.32-696.6.3.El6.x86_64.Conf PostgreSQL-PGDG-LIBS.confusión 

Si echas un vistazo a la mariadb-x86_64.conf, verá un camino absoluto para las bibliotecas de paquetes.

# CAT MARIADB-X86_64.confusión /usr/lib64/mysql 

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

# Exportar ld_library_path =/path/to/biblioteca/archivo 

Administración de bibliotecas compartidas en Linux

Veamos ahora cómo lidiar con las bibliotecas compartidas. Para obtener una lista de todas las dependencias de la biblioteca compartida para un archivo binario, puede usar el utilidad LDD. La salida de LDD está en la forma:

nombre de la biblioteca => nombre de archivo (algún valor hexadecimal) o nombre de archivo (algún valor hexadecimal) #se muestra cuando el nombre de la biblioteca no se puede leer 

Este comando muestra todas las dependencias de biblioteca compartidas para el comando LS.

# ldd/usr/bin/ls o # ldd/bin/ls 
Salida de muestra
 Linux-VDSO.entonces.1 => (0x00007ffebf9c2000) libselinux.entonces.1 => /lib64 /libselinux.entonces.1 (0x0000003b71e00000) Librt.entonces.1 => /lib64 /librt.entonces.1 (0x0000003b71600000) libcap.entonces.2 => /lib64 /libcap.entonces.2 (0x0000003b76a00000) libacl.entonces.1 => /lib64 /libacl.entonces.1 (0x0000003b75e00000) libc.entonces.6 => /lib64 /libc.entonces.6 (0x0000003B70600000) libdl.entonces.2 => /lib64 /libdl.entonces.2 (0x0000003b70a00000) /lib64 /ld-linux-x86-64.entonces.2 (0x0000561ABFC09000) LibpThread.entonces.0 => /lib64 /libpThread.entonces.0 (0x0000003B70E00000) Libattr.entonces.1 => /lib64 /libattr.entonces.1 (0x0000003B75600000) 

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

Por defecto, ldconfig lee el contenido de /etc/ld.entonces.confusión, crea los enlaces simbólicos apropiados en los directorios de enlaces dinámicos, y luego escribe un caché para /etc/ld.entonces.cache que luego es fácilmente utilizado por otros programas.

Esto es muy importante, especialmente cuando acaba de instalar nuevas bibliotecas compartidas o creado sus propios, o creado nuevos directorios de biblioteca. Necesitas ejecutar el ldconfig comandar para efectuar los cambios.

# ldconfig o # ldconfig -v #shows archivos y directorios con los que funciona 

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

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

# ldconfig -n/rath/to/your/bibliotecas 

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 dimos una introducción a las bibliotecas y 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.