stringtranslate.com

enlazador dinámico

En informática , un vinculador dinámico es la parte de un sistema operativo que carga y vincula las bibliotecas compartidas que necesita un ejecutable cuando se ejecuta (en " tiempo de ejecución "), copiando el contenido de las bibliotecas del almacenamiento persistente a la RAM , llenando el salto. tablas y punteros de reubicación . El sistema operativo específico y el formato ejecutable determinan cómo funciona el vinculador dinámico y cómo se implementa.

A menudo se hace referencia a la vinculación como un proceso que se realiza cuando se compila el ejecutable , mientras que un vinculador dinámico es una parte especial de un sistema operativo que carga bibliotecas compartidas externas en un proceso en ejecución y luego vincula esas bibliotecas compartidas dinámicamente al proceso en ejecución. Este enfoque también se denomina enlace dinámico o enlace tardío .

Implementaciones

Microsoft Windows

La biblioteca de vínculos dinámicos , o DLL, es la implementación de Microsoft del concepto de biblioteca compartida en los sistemas operativos Microsoft Windows y OS/2 . Estas bibliotecas suelen tener la extensión de archivo ( para bibliotecas que contienen controles ActiveX ) o (para controladores de sistemas heredados ). Los formatos de archivo para DLL son los mismos que para los archivos EXE de Windows , es decir, ejecutable portátil (PE) para Windows de 32 y 64 bits , y nuevo ejecutable (NE) para Windows de 16 bits . Al igual que los EXE, las DLL pueden contener código , datos y recursos , en cualquier combinación. DLLOCXDRV

Los archivos de datos con el mismo formato de archivo que una DLL, pero con diferentes extensiones de archivo y posiblemente solo contengan secciones de recursos, pueden denominarse DLL de recursos. Ejemplos de este tipo de archivos DLL incluyen bibliotecas de interfaz de usuario en varios idiomas con extensión MUI, bibliotecas de iconos , que a veces tienen la extensión ICL, y archivos de fuentesFON , que tienen las extensiones y FOT. [1]

Sistemas tipo Unix que utilizan ELF y sistemas basados ​​en Darwin

En la mayoría de los sistemas tipo Unix , la mayor parte del código de máquina que constituye el enlazador dinámico es en realidad un ejecutable externo que el kernel del sistema operativo carga y ejecuta primero en un espacio de direcciones de proceso recién construido como resultado de llamadas execo posix_spawnfunciones. En el momento del vínculo, la ruta del vinculador dinámico que se debe utilizar se incrusta en la imagen ejecutable.

Cuando se carga un archivo ejecutable, el kernel del sistema operativo lee la ruta del vinculador dinámico y luego intenta cargar y ejecutar este otro binario ejecutable; si ese intento falla porque, por ejemplo, no hay ningún archivo con esa ruta, el intento de ejecutar el ejecutable original falla. Luego, el vinculador dinámico carga la imagen ejecutable inicial y todas las bibliotecas vinculadas dinámicamente de las que depende e inicia el ejecutable. Como resultado, el nombre de ruta del vinculador dinámico es parte de la interfaz binaria de la aplicación del sistema operativo .

Sistemas que utilizan ELF

En sistemas tipo Unix que utilizan ELF para imágenes ejecutables y bibliotecas dinámicas, como Solaris , versiones de 64 bits de HP-UX , Linux , FreeBSD , NetBSD , OpenBSD y DragonFly BSD , la ruta del vinculador dinámico que se debe utilizar se incrusta en el momento del enlace en la .interpsección del PT_INTERPsegmento del ejecutable. En esos sistemas, las bibliotecas compartidas cargadas dinámicamente se pueden identificar mediante el sufijo del nombre de archivo .so(objeto compartido).

Se puede influir en el vinculador dinámico para que modifique su comportamiento durante la ejecución del programa o durante la vinculación del programa, y ​​los ejemplos de esto se pueden ver en las páginas del manual del vinculador en tiempo de ejecución para varios sistemas similares a Unix. [2] [3] [4] [5] [6] Una modificación típica de este comportamiento es el uso de LD_LIBRARY_PATHvariables LD_PRELOAD de entorno , que ajustan el proceso de vinculación en tiempo de ejecución buscando bibliotecas compartidas en ubicaciones alternativas y cargando y vinculando bibliotecas a la fuerza. que de otro modo no sería así, respectivamente. Un ejemplo es zlibc, [7] también conocido como uncompress.so, [a] que facilita la descompresión transparente cuando se usa a través del LD_PRELOAD hack ; en consecuencia, es posible leer datos de archivos precomprimidos (gzip) en sistemas BSD y Linux como si los archivos no estuvieran comprimidos, lo que esencialmente permite al usuario agregar compresión transparente al sistema de archivos subyacente, aunque con algunas advertencias. El mecanismo es flexible, permitiendo una adaptación trivial del mismo código para realizar procesamiento adicional o alternativo de datos durante la lectura del archivo, previo al suministro de dichos datos al proceso del usuario que lo ha solicitado. [8] [9]

macOS e iOS

En el sistema operativo Apple Darwin , y en los sistemas operativos macOS e iOS integrados sobre él, la ruta del vinculador dinámico que debe usarse se incrusta en el momento del vínculo en uno de los comandos de carga Mach-O en la imagen ejecutable. En esos sistemas, las bibliotecas compartidas cargadas dinámicamente se pueden identificar por el sufijo del nombre del archivo .dylibo por su ubicación dentro del paquete de un marco.

El vinculador dinámico no solo vincula el ejecutable de destino con las bibliotecas compartidas, sino que también coloca funciones de código de máquina en puntos de dirección específicos en la memoria que el ejecutable de destino conoce en el momento del enlace. Cuando un ejecutable desea interactuar con el enlazador dinámico, simplemente ejecuta la llamada específica de la máquina o la instrucción de salto a uno de esos puntos de dirección conocidos. Los ejecutables en las plataformas macOS e iOS suelen interactuar con el vinculador dinámico durante la ejecución del proceso; Incluso se sabe que un ejecutable puede interactuar con el vinculador dinámico, lo que hace que cargue más bibliotecas y resuelva más símbolos, horas después de su lanzamiento inicial. La razón por la que un programa macOS o iOS interactúa con el enlazador dinámico con tanta frecuencia se debe tanto a las API Cocoa y Cocoa Touch de Apple como a Objective-C , el lenguaje en el que se implementan (consulte sus artículos principales para obtener más información).

Se puede obligar al enlazador dinámico a modificar parte de su comportamiento; sin embargo, a diferencia de otros sistemas operativos tipo Unix, estas modificaciones son sugerencias que el enlazador dinámico puede (y a veces ignora). Se pueden ver ejemplos de esto en dyldla página del manual de . [10] Una modificación típica de este comportamiento es el uso de las variables de entorno DYLD_FRAMEWORK_PATHy DYLD_PRINT_LIBRARIES. La primera de las variables mencionadas anteriormente ajusta la ruta de búsqueda de los ejecutables para las bibliotecas compartidas, mientras que la segunda muestra los nombres de las bibliotecas a medida que se cargan y vinculan.

El enlazador dinámico macOS de Apple es un proyecto de código abierto lanzado como parte de Darwin y se puede encontrar en el dyldproyecto de código abierto de Apple. [11]

Sistemas tipo Unix basados ​​en XCOFF

En sistemas operativos tipo Unix que usan XCOFF , como AIX , las bibliotecas compartidas cargadas dinámicamente usan el sufijo de nombre de archivo .a.

Se puede influir en el enlazador dinámico para que modifique su comportamiento durante la ejecución del programa o el enlace del programa. Una modificación típica de este comportamiento es el uso de la LIBPATH variable de entorno . Esta variable ajusta el proceso de vinculación en tiempo de ejecución buscando bibliotecas compartidas en ubicaciones alternativas y cargando y vinculando a la fuerza bibliotecas que de otro modo no estarían, respectivamente.

OS/360 y sucesores

El enlace dinámico desde programas en lenguaje Assembler en IBM OS/360 y sus sucesores se realiza normalmente mediante una macro instrucción LINK que contiene una instrucción de llamada de supervisor que activa las rutinas del sistema operativo que hacen que el módulo de biblioteca que se va a vincular esté disponible para el programa. Los módulos de biblioteca pueden residir en un "STEPLIB" o "JOBLIB" especificado en tarjetas de control y solo disponible para una ejecución específica del programa, en una biblioteca incluida en LINKLIST en PARMLIB (especificada en el momento de inicio del sistema), o en el " área de paquete de enlaces" donde se cargan módulos reentrantes específicos en el momento del inicio del sistema.

multics

En el sistema operativo Multics todos los archivos, incluidos los ejecutables, son segmentos . Una llamada a una rutina que no forma parte del segmento actual hará que el sistema encuentre el segmento al que se hace referencia, en la memoria o en el disco, y lo agregue al espacio de direcciones del proceso en ejecución. Los enlaces dinámicos son el método normal de operación y los enlaces estáticos (usando el binder ) son la excepción.

Eficiencia

El enlace dinámico es generalmente más lento (requiere más ciclos de CPU) que el enlace durante el tiempo de compilación, [12] como es el caso de la mayoría de los procesos ejecutados en tiempo de ejecución. Sin embargo, los enlaces dinámicos suelen consumir más espacio (en el disco y en la memoria en tiempo de ejecución). Cuando una biblioteca está vinculada estáticamente, cada proceso que se ejecuta está vinculado con su propia copia de las funciones de la biblioteca que se invocan. Por lo tanto, si diferentes programas llaman a una biblioteca muchas veces, las mismas funciones de esa biblioteca se duplican en varios lugares de la memoria del sistema. El uso de bibliotecas dinámicas compartidas significa que, en lugar de vincular cada archivo a su propia copia de una biblioteca en el momento de la compilación y potencialmente desperdiciar espacio en la memoria, solo se almacena en la memoria una copia de la biblioteca a la vez, liberando espacio en la memoria para ser utilizado en otros lugares. [13] Además, en los enlaces dinámicos, una biblioteca solo se carga si realmente se está utilizando. [14]

Ver también

Notas

  1. ^ No confundir con la biblioteca de compresión zlib .

Referencias

  1. ^ Corporación Microsoft. "Creación de una DLL de sólo recursos". Biblioteca de la red de desarrolladores de Microsoft .
  2. ^ ld.so.1(1) : Cargador/enlazador dinámico de Solaris -  Manual de referencia de comandos de usuario de Solaris 11.4
  3. ^ ld-linux.so(8)  –  Manual del programador de Linux – Administración y comandos privilegiados
  4. ^ rtld(1) : Cargador/enlazador dinámico de FreeBSD -  Manual de comandos generales de FreeBSD
  5. ^ ld.elf_so(1) : Cargador/enlazador dinámico de NetBSD -  Manual de comandos generales de NetBSD
  6. ^ ld.so(1) : Cargador/enlazador dinámico de OpenBSD -  Manual de comandos generales de OpenBSD
  7. ^ "ZLIBC: acceso transparente a archivos comprimidos". Archivado desde el original el 4 de junio de 2000.
  8. ^ "descomprimir.así". delorie.com . Consultado el 4 de julio de 2014 .
  9. ^ "zlibc.conf". delorie.com . Consultado el 4 de julio de 2014 .
  10. ^ dyld(1) : Cargador/enlazador dinámico Darwin/Mac OS X -  Manual de comandos generales de Darwin y macOS
  11. ^ Apple Inc. "Código abierto: lanzamientos". apple.com . Consultado el 4 de julio de 2014 .
  12. ^ Xuxian, Jiang (2009). "Principios de los sistemas operativos: vinculación y carga" (PDF) . Universidad Estatal de Carolina del Norte . Consultado el 24 de septiembre de 2020 .
  13. ^ Jones, M. (28 de agosto de 2008). "Anatomía de las bibliotecas dinámicas de Linux". IBM . Consultado el 24 de septiembre de 2020 .
  14. ^ Sivilotti, Paul (agosto de 2012). "Enlace y carga dinámica" (PDF) . Universidad del Estado de Ohio . Consultado el 24 de septiembre de 2020 .

Otras lecturas

enlaces externos