09/11/2021
En el entorno del desarrollo de software en sistemas Linux, las bibliotecas compartidas (también conocidas como bibliotecas dinámicas o DLLs en otros sistemas operativos) juegan un papel crucial. Estas bibliotecas contienen código reutilizable que puede ser utilizado por múltiples programas, optimizando el uso de memoria y facilitando la actualización del software. Comprender cómo se gestionan estas bibliotecas, incluyendo su ubicación en el sistema de archivos y su interacción con los programas, es fundamental para cualquier desarrollador.
- ¿Qué son las Bibliotecas Compartidas?
- Convenciones de Nombres y Ubicaciones
- Cómo se Utilizan las Bibliotecas Compartidas
- Variables de Entorno
- Creación de una Biblioteca Compartida
- Instalación y Uso de una Biblioteca Compartida
- Manejo de Múltiples Versiones
- Bibliotecas Compartidas y el Enlazador
- Ventajas de las Bibliotecas Compartidas
- Tabla Comparativa: Bibliotecas Estáticas vs. Compartidas
¿Qué son las Bibliotecas Compartidas?
Una biblioteca compartida es un archivo que contiene código objeto, funciones y datos que pueden ser utilizados por varios programas a la vez. A diferencia de las bibliotecas estáticas, que se enlazan directamente al código del programa durante la compilación, las bibliotecas compartidas se cargan en memoria solo cuando un programa las necesita. Esto reduce el tamaño de los ejecutables y permite que varios programas compartan la misma copia de la biblioteca, ahorrando memoria.
Las bibliotecas compartidas en Linux suelen tener la extensión .so (shared object). Su manejo implica una serie de convenciones y mecanismos para garantizar la compatibilidad entre diferentes versiones de la biblioteca y los programas que las utilizan.
Convenciones de Nombres y Ubicaciones
Cada biblioteca compartida tiene tres nombres importantes:
- Soname (nombre de versión compartida): Este nombre incluye la versión de la biblioteca (ej:
libmylib.so.3). Se utiliza para identificar la versión específica de la biblioteca que un programa requiere. Es, en esencia, un enlace simbólico al nombre real de la biblioteca. - Nombre Real: Este es el nombre del archivo que contiene el código de la biblioteca (ej:
libmylib.so.3). Contiene información de versión más detallada. - Nombre del Enlazador: Es el nombre que se utiliza durante la compilación (ej:
libmylib.so). Normalmente un enlace simbólico a la última versión disponible.
La separación de estos nombres permite una gestión eficaz de las versiones de la biblioteca. Los programas solo hacen referencia al soname que necesitan, mientras que el sistema gestiona los enlaces simbólicos para apuntar a la versión correcta.
La ubicación de las bibliotecas compartidas en el sistema de archivos sigue ciertas convenciones. Los estándares GNU recomiendan instalarlas en /usr/local/libdurante el desarrollo, mientras que el Estándar de Jerarquía del Sistema de Archivos (FHS) recomienda /usr/libpara las bibliotecas del sistema y /usr/local/libpara las bibliotecas que no son parte del sistema. Distribuciones como las derivadas de Red Hat pueden requerir la adición de /usr/local/libal archivo /etc/ld.so.confpara que el sistema pueda encontrar las bibliotecas instaladas en esta ubicación.
Cómo se Utilizan las Bibliotecas Compartidas
Cuando se ejecuta un programa en Linux, el cargador dinámico ( /lib/ld-linux.so.X) se encarga de cargar las bibliotecas compartidas que el programa necesita. La lista de directorios donde buscar las bibliotecas se encuentra en /etc/ld.so.conf. Para acelerar este proceso, se utiliza un archivo de caché ( /etc/ld.so.cache) que se actualiza mediante el comando ldconfigcada vez que se instala o elimina una biblioteca, o se modifica la lista de directorios de búsqueda.
Variables de Entorno
Varias variables de entorno influyen en el proceso de carga de bibliotecas:
- LD_LIBRARY_PATH: Permite especificar directorios adicionales donde buscar bibliotecas, lo cual es útil durante el desarrollo o para usar bibliotecas no estándar. Sin embargo, modificarla durante la instalación no es recomendable.
- LD_PRELOAD: Permite cargar bibliotecas que sobrescriben funciones de otras bibliotecas, útil para parches o depuración.
- LD_DEBUG: Activa un modo de depuración para el cargador dinámico, que proporciona información detallada sobre el proceso de carga.
Tener en cuenta que las variables de entorno son ignoradas o limitadas para programas con privilegios setuido setgid, para evitar vulnerabilidades de seguridad.
Creación de una Biblioteca Compartida
Para crear una biblioteca compartida, se deben seguir estos pasos:

- Compilar los archivos objeto con la opción
-fPIC(o-fpic) para generar código independiente de la posición. - Utilizar la opción
-Wl,-soname,para especificar el soname de la biblioteca durante el enlace. - Enlazar los archivos objeto utilizando la opción
-sharedpara generar la biblioteca compartida.
Ejemplo de comando de compilación:
gcc -fPIC -c -Wall a.c b.cgcc -shared -Wl,-soname,libmylib.so.1 -o libmylib.so.0.1 a.o b.o -lcEn algunos casos, es necesario utilizar la opción -Wl,-export-dynamicpara exportar todos los símbolos de la biblioteca, especialmente cuando se tienen dependencias inversas.
Instalación y Uso de una Biblioteca Compartida
Una vez creada la biblioteca compartida, se puede instalar copiándola en un directorio estándar ( /usr/lib) y ejecutando ldconfig. Si la biblioteca no se instala en una ubicación estándar, se puede utilizar la opción -Lde gcc, la opción rpathdel enlazador, o la variable de entorno LD_LIBRARY_PATHpara indicar al sistema dónde encontrarla.
El comando lddse puede usar para ver las bibliotecas compartidas que usa un programa. Sin embargo, se debe tener cuidado al ejecutar ldden programas no confiables, ya que podría ser una vulnerabilidad de seguridad.
Manejo de Múltiples Versiones
El sistema de nombres permite la coexistencia de múltiples versiones de una misma biblioteca en un sistema. Si una actualización de una biblioteca rompe la compatibilidad con un programa, se puede copiar la versión anterior de la biblioteca y crear un script envoltorio que ajuste la variable LD_LIBRARY_PATHpara usar la versión antigua.

Bibliotecas Compartidas y el Enlazador
El orden en que se especifican las bibliotecas al enlazador es crucial. Si una biblioteca A depende de una biblioteca B, la biblioteca B debe especificarse después de la A. De lo contrario, el enlazador no encontrará los símbolos necesarios. Las dependencias circulares entre bibliotecas deben evitarse.
Ventajas de las Bibliotecas Compartidas
- Reducción del tamaño de los ejecutables: Los programas resultantes son más pequeños.
- Ahorro de memoria: Múltiples programas pueden compartir la misma copia de la biblioteca en memoria.
- Fácil actualización: Actualizar una biblioteca compartida actualiza automáticamente todos los programas que la utilizan.
- Modularidad: Facilita la organización y el mantenimiento de proyectos de software grandes.
Tabla Comparativa: Bibliotecas Estáticas vs. Compartidas
| Característica | Biblioteca Estática | Biblioteca Compartida |
|---|---|---|
| Enlace | Enlazado en tiempo de compilación | Enlazado en tiempo de ejecución |
| Tamaño del ejecutable | Mayor | Menor |
| Uso de memoria | Mayor | Menor (compartida entre programas) |
| Actualización | Requiere recompilación del programa | Actualización automática |
| Extensión de archivo | .a | .so |
Las carpetas que contienen bibliotecas compartidas son esenciales para el funcionamiento correcto de los programas en Linux. Comprender su organización, sus convenciones de nombres y la forma en que interactúan con los programas es clave para desarrollar y mantener aplicaciones robustas y eficientes.
Si quieres conocer otros artículos parecidos a Carpetas que contienen bibliotecas compartidas en linux puedes visitar la categoría Libros y Librerías.
