Una biblioteca compartida o una biblioteca compartida es un archivo destinado a ser compartido entre . Los módulos utilizados por un programa se cargan desde objetos compartidos separados en la memoria en lugar de ser copiados por el enlazador cuando copia un solo ejecutable para un programa.
Las bibliotecas compartidas se pueden vincular estáticamente, lo que significa que las referencias a los módulos de la biblioteca se resuelven y la memoria se asigna a los módulos cuando se crea el ejecutable. Pero a menudo, la vinculación de las bibliotecas compartidas se retrasa hasta que se cargan.
Algunos sistemas más antiguos, por ejemplo, Burroughs MCP , Multics , también tienen un solo formato para los archivos ejecutables, sean o no genéricos. Tienen archivos de biblioteca compartidos en el mismo formato que los archivos ejecutables. Esto tiene dos ventajas principales: primero, cada uno de ellos requiere solo un cargador de arranque, no dos (tener un cargador de arranque separado trae una complejidad adicional). En segundo lugar, también permite que los ejecutables se utilicen como bibliotecas compartidas, siempre que tengan una tabla de símbolos . Los formatos típicos combinados de biblioteca compartida y ejecutable son ELF y Mach-O (ambos en Unix) y PE (Windows).
En algunos entornos más antiguos, como Windows de 16 bits o MPE para HP 3000 , solo se permitían datos basados en pilas (locales) el código de biblioteca compartida, o se impusieron otras restricciones significativas al código de biblioteca compartida.
El código de la biblioteca se puede compartir en la memoria con los procesos , así como en el disco. Si se usa memoria virtual, los procesos se ejecutarán en una página física de RAM que se asigna a diferentes espacios de direcciones de proceso. Esto tiene sus beneficios. Por ejemplo, en un sistema OpenStep , las aplicaciones suelen tener unos pocos cientos de kilobytes de tamaño y se cargan rápidamente; la mayor parte de su código estaba en bibliotecas que el sistema operativo ya había cargado para otros fines.
Los programas pueden compartir RAM usando código independiente , como en Unix , dando como resultado una arquitectura compleja pero flexible. Esto asegura que, a través de varios trucos, como la asignación previa del espacio de direcciones y las reservas de páginas para cada biblioteca compartida, tenga más posibilidades de ser compartida. La tercera opción es el almacenamiento de un solo nivel utilizado por IBM System/38 y sus sucesores.
En algunos casos, diferentes versiones de bibliotecas compartidas pueden causar problemas, especialmente cuando las bibliotecas de diferentes versiones tienen el mismo nombre de archivo y son utilizadas por diferentes aplicaciones instaladas en el sistema, cada una de las cuales requiere una versión diferente. Tal script se conoce como DLL hell , llamado así por las DLL de Windows y OS/2 . La mayoría de los sistemas operativos modernos posteriores a 2001 tienen métodos de limpieza para lidiar con tales situaciones, o usan bibliotecas "privadas" específicas de la aplicación.