Articulo de referencia

Biblioteca dinámica

Una biblioteca dinámica es aquella que contiene funciones y datos que un programa informático puede utilizar en tiempo de ejecución , cargados desde un archivo independiente del...

Una biblioteca dinámica es aquella que contiene funciones y datos que un programa informático puede utilizar en tiempo de ejecución , cargados desde un archivo independiente del ejecutable del programa . El enlace dinámico o enlace tardío permite utilizar una biblioteca dinámica mediante la vinculación de las referencias a la biblioteca del programa con los objetos asociados, ya sea en tiempo de carga o en tiempo de ejecución . Durante la compilación del programa, el enlazador registra los objetos de la biblioteca que utiliza el programa. Al ejecutarse el programa, un enlazador dinámico o cargador de enlace asocia las referencias a la biblioteca del programa con los objetos asociados.

Una biblioteca dinámica puede vincularse en tiempo de compilación a un stub para cada recurso de biblioteca que se resuelve en tiempo de ejecución. [ 1 ] Alternativamente, una biblioteca dinámica puede cargarse sin vincularse a stubs.

La mayoría de los sistemas operativos modernos utilizan el mismo formato tanto para una biblioteca dinámica como para un ejecutable [ NB 1 ], lo que ofrece dos ventajas principales: requiere solo un cargador y permite que un archivo ejecutable se utilice como una biblioteca compartida . Algunos ejemplos de formatos de archivo utilizados tanto para bibliotecas dinámicas como para archivos ejecutables son ELF , Mach-O y PE .

Una biblioteca dinámica recibe diferentes nombres en distintos contextos. En Windows y OS/2, la tecnología se denomina biblioteca de enlace dinámico . En el espacio de usuario tipo Unix , se denomina objeto compartido dinámico (DSO) o, generalmente, simplemente objeto compartido (SO). En el kernel de Linux , se denomina módulo de kernel cargable (LKM). En OpenVMS , se denomina imagen compartible . [ 2 ]

Como alternativa al enlace dinámico, se incluye una biblioteca estática en el archivo ejecutable del programa, de modo que no sea necesaria en tiempo de ejecución.

Carga dinámica

La carga dinámica es el proceso de cargar una biblioteca dinámica en tiempo de ejecución y también de descargarla. Una carga puede ser iniciada implícita o explícitamente por un programa. Una solicitud implícita ocurre si el programa está configurado para cargar automáticamente la biblioteca dinámica y esto se configura en tiempo de enlace. Las solicitudes explícitas son realizadas por un programa a través de llamadas a la API del sistema operativo. Por ejemplo, Windows proporciona LoadLibrary, LoadLibraryEx, FreeLibraryy GetProcAddress. Los sistemas basados ​​en POSIX , incluidos la mayoría de los sistemas UNIX y similares a UNIX, usan dlopen, dlclosey dlsym.

Un cargador dinámico localiza una biblioteca dinámica a petición, y su implementación varía. Algunos cargadores dependen de que el ejecutable almacene la ruta completa a la biblioteca. Cualquier cambio en el nombre o la ubicación de la biblioteca provoca un fallo en tiempo de ejecución. Lo más habitual es que el nombre de la biblioteca, sin la información de la ruta, se almacene en el ejecutable, y el cargador aplica un algoritmo de búsqueda para encontrar el archivo.

Si una biblioteca dinámica de la que depende un programa no está disponible (se eliminó, se movió o se renombró) o se reemplazó por una versión incompatible, el ejecutable fallará en tiempo de ejecución. Esto se conoce como " infierno de dependencias" o, en Windows, "infierno de DLL" . Los problemas se pueden minimizar nombrando los archivos de la biblioteca con un número de versión y siguiendo las reglas de versionado que exigen cambiar la versión cuando se realiza un cambio incompatible.

Windows

Para una DLL personalizada, Windows comprueba el directorio donde cargó el programa; los directorios configurados a través de SetDllDirectory(); los directorios System32, System y Windows; luego el directorio de trabajo actual; y finalmente los directorios especificados por la variable de entorno PATH . [ 3 ] Las aplicaciones escritas para .NET Framework (desde 2002) también comprueban la caché de ensamblados global como almacenamiento principal de archivos DLL compartidos para eliminar el problema del infierno de las DLL .

Originalmente, para COM , Windows solo consultaba el registro para localizar una DLL que proporcionara una clase de objeto. Posteriormente, Windows permitió la carga desde un archivo DLL ubicado junto con el ejecutable del programa.

Para solucionar el problema conocido como "el infierno de las DLL", las aplicaciones de Windows suelen instalarse con archivos DLL privados y el sistema impide la sustitución de las DLL compartidas del sistema por versiones anteriores.

OpenStep

OpenStep utilizaba un sistema más flexible, que recopilaba una lista de bibliotecas de varias ubicaciones conocidas (similar al concepto de PATH) al iniciar el sistema. Mover las bibliotecas no causa ningún problema, aunque los usuarios incurren en un tiempo de espera al iniciar el sistema por primera vez.

Sistemas tipo Unix

La mayoría de los sistemas tipo Unix tienen una "ruta de búsqueda" que especifica los directorios del sistema de archivos donde buscar bibliotecas dinámicas. Algunos sistemas especifican la ruta predeterminada en un archivo de configuración , otros la codifican directamente en el cargador dinámico. Algunos formatos de archivos ejecutables pueden especificar directorios adicionales donde buscar bibliotecas para un programa en particular. Esto generalmente se puede anular con una variable de entorno , aunque está deshabilitado para programas setuid y setgid, para que un usuario no pueda forzar a dicho programa a ejecutar código arbitrario con permisos de root. Se recomienda a los desarrolladores de bibliotecas que coloquen sus bibliotecas dinámicas en ubicaciones de la ruta de búsqueda predeterminada. Como desventaja, esto puede dificultar la instalación de nuevas bibliotecas, y estas ubicaciones "conocidas" rápidamente se convierten en el hogar de un número creciente de archivos de biblioteca, lo que hace que la administración sea más compleja.

Encuadernación previa

Como optimización, los sistemas pueden calcular la dirección de carga probable para cada biblioteca dinámica en el sistema para minimizar el tiempo de carga cuando se necesita la biblioteca. Esta optimización se conoce como prebinding y prelinking en macOS y Linux, respectivamente. IBM z/VM utiliza una técnica similar, llamada Segmentos Guardados Discontinuos (DCSS). [ 4 ] Las desventajas de esta técnica incluyen el tiempo requerido para calcular las direcciones cada vez que cambia una biblioteca dinámica, la imposibilidad de usar la aleatorización del diseño del espacio de direcciones y el requisito de suficiente espacio de direcciones virtuales para su uso.

Historia

El enlace dinámico se desarrolló originalmente para el sistema operativo Multics , a partir de 1964, y el MTS ( Michigan Terminal System ), construido a finales de la década de 1960. [ 5 ]

Notas

  1. Algunos sistemas más antiguos, por ejemplo, Burroughs MCP , Multics , también tienen un formato único.

Referencias

  1. Microsoft (29/10/2021). "Tutorial: Crear y usar una biblioteca estática (C++)" . learn.microsoft.com . Consultado el 1/02/2025 . Usar una biblioteca estática es una excelente manera de reutilizar código. En lugar de reimplementar las mismas rutinas en cada aplicación que requiera la funcionalidad, se escriben una sola vez en una biblioteca estática y luego se hace referencia a ella desde las aplicaciones. El código vinculado desde una biblioteca estática pasa a formar parte de la aplicación; no es necesario instalar otro archivo para usar el código.
  2. "Manual de utilidades del enlazador VSI OpenVMS" (PDF) . VSI. Agosto de 2019. Consultado el 31 de enero de 2021 .
  3. "Orden de búsqueda de la biblioteca de vínculos dinámicos" . Biblioteca de la red de desarrolladores de Microsoft . Microsoft. 6 de marzo de 2012. Archivado del original el 9 de mayo de 2012. Consultado el 20 de mayo de 2012 .
  4. IBM Corporation (2011). Planificación y administración de segmentos guardados (PDF) . Consultado el 29 de enero de 2022 .
  5. "Una historia de MTS". Information Technology Digest . 5 (5).

Fuentes

  • Levine, JR (2000). Enlazadores y cargadores . Serie de sistemas operativos. Elsevier Science. ISBN 978-1-55860-496-4. Consultado el 2 de febrero de 2025 .