fbpx Bibliotecas Compartidas en Linux: ldd, ldconfig y .so | Certificação Linux

Bibliotecas Compartidas en Linux: Funcionamiento y Gestión

📅 07/03/2019 ⏱ 6 min ✍️ Uira Ribeiro
Linuxcomandoscómo-hacer
Bibliotecas Compartidas en Linux: Funcionamiento y Gestión
Exam Pass App — mais de 7.000 questões LPI, offline, em 5 idiomas, disponível no Android e na App Store
Disponible en
Google Play
Disponible en
App Store

Cómo funcionan las Bibliotecas Compartilhadas en Linux (shared libraries) en Linux, y cómo esto puede interferir en el funcionamiento de los programas.

Determinar qué bibliotecas compartidas necesita un programa ejecutable para ejecutarse e instalarlas cuando sea necesario es parte de los objetivos del examen.

Para entender la gestión de las bibliotecas compartidas, primero necesitamos entender qué son las bibliotecas y para qué sirven.

Durante la escritura del código fuente de un programa, el desarrollador hace uso de diversas funciones y procedimientos ya definidos por el sistema operativo en archivos llamados bibliotecas.

Estas funciones permiten que el programador pueda usar recursos como escritura en disco, escritura en pantalla, recibir datos del teclado, del mouse, enviar datos por la red y mucho más, sin necesidad de reescribir la rueda.

Cuando el programa es compilado, el último etapa de su construcción es hacer los enlaces.

Algunos compiladores ya hacen este proceso de reunir todos los objetos necesarios y componer un objeto final automáticamente.

Otros necesitan que el programador ejecute otro programa llamado linker. Las bibliotecas pueden entenderse de manera grosera como las "DLLs" de Windows.

Directorio /lib64

En las distribuciones modernas de 64 bits las bibliotecas están en el directorio /lib64. Dependiendo de la arquitectura del procesador, el nombre del directorio puede variar (ej. /lib para 32 bits).

Tipos de Biblioteca

Existen dos tipos de bibliotecas en Linux. Las estáticas y las dinámicas. La decisión de qué biblioteca utilizar le compete al programador.

Al usar una biblioteca estática, el linker encuentra las funciones y procedimientos que el programa necesita, y las copia físicamente en el archivo de salida ejecutable generado.

Esto hace que el ejecutable final pueda funcionar de forma independiente sin utilizar ninguna biblioteca. Pero se pierde en rendimiento, en el gasto innecesario de memoria y en el tamaño del programa final.

Es común que el programador haga uso de las bibliotecas compartidas en lugar de estáticas. Al hacer los enlaces de un programa que las utiliza, el linker hace una referencia a las bibliotecas compartidas.

De esta forma, cuando este programa sea ejecutado, el sistema tendrá que cargar primero las bibliotecas necesarias, si estas ya no están en memoria.

De esta manera, los ejecutables generados son más eficientes, ya que tienden a ser más pequeños, usar menos memoria y ocupar menos espacio en disco.

El punto débil de esta metodología es que los programas necesitan las bibliotecas compartidas y un cambio en las versiones de estos archivos también puede afectar su funcionamiento.

¿Qué son los "soname"?

Toda biblioteca compartida tiene un nombre especial llamado "soname". El soname está compuesto por el prefijo "lib", seguido del nombre de la biblioteca, el sufijo ".so." y el número de versión de la biblioteca que se incrementa cuando esta sufre cambios en su interfaz.

Por ejemplo:

libjack-0.80.0.so.0
libvorbis.so.0
libWand.so.6
libjpeg.so.62
libwv2.so.1

Los archivos ejecutables son examinados en el tiempo de ejecución por el linker de tiempo de ejecución llamado ld.so.

Este intérprete especial completa los enlaces entre el ejecutable y las bibliotecas compartidas. Si ld.so no puede encontrar y leer las dependencias, fallará y el ejecutable no será cargado.

El Linker enlaza las bibliotecas al software

El linker ld.so mantiene índice de todas las bibliotecas y su ubicación en un archivo especial llamado /etc/ld.so.cache. Es binario y, por lo tanto, puede ser leído rápidamente por ld.so.

Es por eso que un administrador Linux debe estar preparado para gestionar las bibliotecas compartidas y sus versiones para un correcto funcionamiento del sistema y sus aplicaciones.

En este artículo puedes aprender más sobre el proceso de compilación y "linkage" de los programas en las bibliotecas.

Veamos los utilitários que ayudarán en esta tarea:

Programa ldd en Linux

El comando ldd – List Dynamic Dependencies – provee una lista de las dependencias dinámicas que un determinado programa necesita. Retornará el nombre de la biblioteca compartida y su ubicación esperada.

Ejemplo:

# ldd /bin/bash

libreadline.so.4 => /lib/libreadline.so.4 (0x4001c000)

libhistory.so.4 => /lib/libhistory.so.4 (0x40049000)

libncurses.so.5 => /lib/libncurses.so.5 (0x40050000)

libdl.so.2 => /lib/libdl.so.2 (0x40096000)

libc.so.6 => /lib/libc.so.6 (0x40099000)

/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

# ldd ldd teste_dijkstra

libc.so.6 => /lib/libc.so.6 (0x4001c000)

/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

Este comando es importante para determinar cuáles son las bibliotecas necesarias de un ejecutable.

Programa ldconfig en Linux

El utilitário ldconfig crea los enlaces y rehace el índice de las bibliotecas dinámicas del archivo /etc/ld.so.cache.

Busca bibliotecas en los directorios /usr/lib y /lib, así como en los directorios listados en /etc/ld.so.conf, además del directorio informado en la línea de comandos.

Las opciones más comunes son:

  • -p: Lista el contenido del cache /etc/ld.so.cache.
  • -v: Muestra el progreso de la actualización del cache.
  • -f: archivo informa otro archivo de configuración diferente del estándar /etc/ld.so.conf.

Ejemplos:

# ldconfig –p

229 libs found in cache '/etc/ld.so.cache'

src_vipa.so (ELF) => /usr/lib/src_vipa.so

libz.so.1 (libc6) => /lib/libz.so.1

libz.so.1 (libc6) => /usr/lib/libz.so.1

# ldconfig –v

/usr/X11R6/lib:

libSM.so.6 -> libSM.so.6.0

libdps.so.1 -> libdps.so.1.0

libXrender.so.1 -> libXrender.so.1.2

(…)

Variable ambiental LD_LIBRARY_PATH

También es posible proporcionarle al linker en tiempo de ejecución ld.so una lista de directorios extras que pueden contener bibliotecas compartidas a través de la variable ambiental LD_LIBRARY_PATH.

Una lista de directorios puede ser configurada, separándolos por dos puntos ":". Esta lista precede a la lista del archivo ls.so.conf.

# set | grep LD_LIBRARY_PATH

LD_LIBRARY_PATH=/usr/lib

Por razones de seguridad, la variable LD_LIBRARY_PATH es ignorada por ld.so cuando este hace enlaces de programas que tienen el bit SUID o SGID habilitados.

Su uso es común para probar nuevas rutinas en bibliotecas en desarrollo en lugar de ejecutar las rutinas ya instaladas.

Cada vez que una nueva biblioteca sea instalada, o una nueva versión de biblioteca, es necesario actualizar el cache del linker ld.so con el comando ldconfig.

Aprende mucho más sobre Linux en nuestro curso en línea. Puedes realizar la inscripción aquí. Si ya tienes una cuenta, o quieres crear una, simplemente ingresa o crea tu usuario aquí.

¿Te gustó? Comparte

Uira Ribeiro

Prof. Uirá Ribeiro

Chair do Board do Linux Professional Institute

Después de años viendo profesionales perder horas en tareas simples por no conocer las herramientas correctas de Linux, decidí enseñar.
Hoy soy autor de la mayoría de los Materiales de Aprendizaje oficiales de la LPI y mentor de más de 14,000 alumnos certificados.

Conoce mi historia completa →

Eso fue solo una pieza. El curso enseña el camino completo — desde tu primer comando hasta el día del examen.

Certificação Linux — a plataforma líder em certificações Linux no Brasil
WhatsApp