Articulo de referencia

Enlazador dinámico

Un enlazador dinámico es una función del sistema operativo que carga y enlaza bibliotecas dinámicas para un ejecutable en tiempo de ejecución , antes o durante su ejecución. Aun...

Un enlazador dinámico es una función del sistema operativo que carga y enlaza bibliotecas dinámicas para un ejecutable en tiempo de ejecución , antes o durante su ejecución. Aunque los detalles varían según el sistema operativo, normalmente, un enlazador dinámico copia el contenido de cada biblioteca desde el almacenamiento persistente a la RAM , llena las tablas de salto y reubica los punteros .

El enlazado se suele definir como un proceso que se realiza al compilar el ejecutable , mientras que un enlazador dinámico es una parte especial del sistema operativo que carga bibliotecas compartidas externas en un proceso en ejecución y luego las vincula dinámicamente a dicho proceso. Este enfoque también se conoce como enlace tardío .

Implementaciones

Microsoft Windows

Las bibliotecas de vínculos dinámicos (DLL) son 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 .txt (para bibliotecas que contienen controles ActiveX ) o .exe (para controladores de sistema heredados ). Los formatos de archivo para las DLL son los mismos que para los archivos EXE de Windows : Portable Executable (PE) para Windows de 32 y 64 bits , y New Executable (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 que una DLL, pero con extensiones diferentes y que posiblemente contengan solo secciones de recursos, pueden denominarse DLL de recursos. Ejemplos de estas DLL incluyen bibliotecas de interfaz de usuario multilingües con extensión MUI, bibliotecas de iconos , a veces con la extensión ICL, y archivos de fuentes , con las extensiones FONy 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 máquina que conforma el enlazador dinámico es en realidad un ejecutable externo que el núcleo del sistema operativo carga y ejecuta primero en un espacio de direcciones de proceso recién creado como resultado de la llamada execa posix_spawnfunciones. En el momento del enlace, la ruta del enlazador dinámico que debe utilizarse se integra en la imagen del ejecutable.

Cuando se carga un archivo ejecutable, el núcleo del sistema operativo lee la ruta del enlazador dinámico y luego intenta cargar y ejecutar este otro binario ejecutable; si ese intento falla porque, por ejemplo, no existe ningún archivo con esa ruta, falla el intento de ejecutar el ejecutable original. El enlazador dinámico carga entonces la imagen ejecutable inicial y todas las bibliotecas enlazadas dinámicamente de las que depende, e inicia el ejecutable. Como resultado, la ruta del enlazador dinámico forma 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 , las versiones de 64 bits de HP-UX , Linux , FreeBSD , NetBSD , OpenBSD y DragonFly BSD , la ruta del enlazador dinámico que se debe usar se inserta en tiempo de enlace en la .interpsección del PT_INTERPsegmento del ejecutable. En esos sistemas, las bibliotecas compartidas cargadas dinámicamente se pueden identificar por el sufijo del nombre del archivo .so(objeto compartido).

El enlazador dinámico puede ser influenciado para modificar su comportamiento durante la ejecución del programa o el enlace del programa, y ​​los ejemplos de esto pueden verse en las páginas del manual del enlazador en tiempo de ejecución para varios sistemas tipo Unix. [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] Una modificación típica de este comportamiento es el uso de variables de entornoLD_LIBRARY_PATH y , que ajustan el proceso de enlace en tiempo de ejecución buscando bibliotecas compartidas en ubicaciones alternativas y cargando y enlazando forzosamente bibliotecas que de otro modo no lo harían, respectivamente. Un ejemplo es zlibc, [ 7 ] también conocido como , [ a ] ​​que facilita la descompresión transparente cuando se usa a través del 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 a un usuario agregar compresión transparente al sistema de archivos subyacente, aunque con algunas salvedades. El mecanismo es flexible, lo que permite una adaptación sencilla del mismo código para realizar un procesamiento adicional o alternativo de los datos durante la lectura del archivo, antes de que dichos datos se proporcionen al proceso de usuario que los ha solicitado. [ 8 ] [ 9 ]LD_PRELOADuncompress.soLD_PRELOAD

Sistemas basados ​​en Darwin

En el sistema operativo Darwin de Apple , y en los sistemas operativos de Apple basados ​​en él, como macOS , iOS , iPadOS , tvOS , watchOS y visionOS , la ruta del enlazador dinámico que se debe usar se integra en tiempo de enlace en uno de los comandos de carga Mach-O de 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 framework.

El enlazador dinámico no solo enlaza el ejecutable de destino con las bibliotecas compartidas, sino que también coloca las funciones de código máquina en direcciones de memoria específicas que el ejecutable de destino conoce en el momento del enlace. Cuando un ejecutable desea interactuar con el enlazador dinámico, simplemente ejecuta la instrucción de llamada o salto específica de la máquina a una de esas direcciones conocidas. Los ejecutables en las plataformas basadas en Darwin suelen interactuar con el enlazador dinámico durante la ejecución del proceso; incluso se sabe que un ejecutable puede interactuar con el enlazador dinámico, provocando que cargue más bibliotecas y resuelva más símbolos, horas después de su inicio. La razón por la que muchos programas para un sistema operativo basado en Darwin interactúan tan a menudo con el enlazador dinámico se debe tanto a las API Cocoa y Cocoa Touch de Apple , utilizadas por la mayoría de las aplicaciones para esos sistemas operativos, como a Objective-C , el lenguaje en el que se implementan esas API (consulte sus artículos principales para obtener más información).

El enlazador dinámico puede ser forzado 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 ignorar (y a veces lo hace). Ejemplos de esto se pueden ver en la dyldpá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 enlazan.

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

Sistemas tipo Unix basados ​​en XCOFF

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

El enlazador dinámico puede modificar su comportamiento durante la ejecución o el enlazado del programa. Una modificación típica de este comportamiento es el uso de la LIBPATHvariable de entorno . Esta variable ajusta el proceso de enlazado en tiempo de ejecución buscando bibliotecas compartidas en ubicaciones alternativas y cargando y enlazando de forma forzada bibliotecas que de otro modo no se cargarían.

OS/360 y sus sucesores

El enlace dinámico desde programas en lenguaje ensamblador en IBM OS/360 y sus sucesores se realiza normalmente mediante una instrucción macro LINK que contiene una instrucción Supervisor Call que activa las rutinas del sistema operativo y hace que el módulo de biblioteca que se va a enlazar esté disponible para el programa. Los módulos de biblioteca pueden residir en una "STEPLIB" o "JOBLIB" especificada en las tarjetas de control y disponible solo para una ejecución específica del programa, en una biblioteca incluida en la LINKLIST de la PARMLIB (especificada al iniciar el sistema), o en el "área de paquetes de enlace" donde se cargan módulos reentrantes específicos al iniciar el 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 localice el segmento referenciado, ya sea en memoria o en disco, y lo añada al espacio de direcciones del proceso en ejecución. El enlace dinámico es el método de funcionamiento habitual, y el enlace estático (mediante el enlazador ) es la excepción.

Eficiencia

El enlace dinámico suele ser más lento (requiere más ciclos de CPU) que el enlace durante la compilación, [ 12 ] como ocurre con la mayoría de los procesos ejecutados en tiempo de ejecución. Sin embargo, el tiempo de carga puede reducirse mediante el "enlace diferido", un proceso en el que las llamadas a las funciones de una biblioteca se enlazan con la implementación (dentro de la biblioteca) solo cuando se produce la primera llamada; un efecto secundario es que, una vez cargado el programa, la primera llamada a una función sería más lenta, ya que el tiempo para enlazarla se trasladó del tiempo de inicio al tiempo de ejecución.

Sin embargo, el enlace dinámico suele ser más eficiente en cuanto al espacio (tanto en disco como en memoria durante la ejecución). Cuando una biblioteca se enlaza estáticamente, cada proceso en ejecución se enlaza con su propia copia de las funciones de la biblioteca que se están utilizando. Por lo tanto, si una biblioteca es llamada muchas veces por diferentes programas, las mismas funciones de esa biblioteca se duplican en varios lugares de la memoria del sistema. El uso de bibliotecas dinámicas compartidas implica que, en lugar de enlazar cada archivo con su propia copia de una biblioteca en tiempo de compilación y potencialmente desperdiciar espacio de memoria, solo se almacena una copia de la biblioteca en memoria a la vez, liberando espacio de memoria para ser utilizado en otros lugares. [ 13 ] Además, en el enlace dinámico, una biblioteca solo se carga si realmente se está utilizando. [ 14 ]

Véase también

Notas

  1. No confundir con labiblioteca de compresión zlib

Referencias

  1. Microsoft Corporation. "Creación de una DLL de solo recursos" . Biblioteca de la red de desarrolladores de Microsoft .
  2. : Enlazador/cargador dinámico de Solaris Manual de referencia de comandos de usuario de Solaris 11.4ld.so.1(1)   
  3. Manual del programador de Linux – Administración y comandos privilegiados de Manned.orgld-linux.so(8)  
  4. : Enlazador/cargador dinámico de FreeBSD Manual de comandos generales de FreeBSDrtld(1)   
  5. : Enlazador/cargador dinámico de NetBSD Manual de comandos generales de NetBSDld.elf_so(1)   
  6. : Enlazador/cargador dinámico de OpenBSD Manual de comandos generales de OpenBSDld.so(1)   
  7. "ZLIBC - Acceso transparente a archivos comprimidos" . Archivado del original el 4 de junio de 2000.
  8. "uncompress.so" . delorie.com . Consultado el 4 de julio de 2014 .
  9. "zlibc.conf" . delorie.com . Consultado el 4 de julio de 2014 .
  10. : Enlazador/cargador dinámico de Darwin/Mac OS X Manual de comandos generales de Darwin y macOSdyld(1)   
  11. Apple Inc. "Código abierto - Lanzamientos" . apple.com . Consultado el 4 de julio de 2014 .
  12. Xuxian, Jiang (2009). "Principios de sistemas operativos: enlace y carga" (PDF) . Universidad Estatal de Carolina del Norte . Recuperado el 24 de septiembre de 2020 .
  13. Jones, M. (2008-08-28). "Anatomía de las bibliotecas dinámicas de Linux" . IBM . Recuperado el 24 de septiembre de 2020 .
  14. Sivilotti, Paul (agosto de 2012). "Enlace y carga dinámicos" (PDF) . Universidad Estatal de Ohio . Recuperado el 24 de septiembre de 2020 .

Lecturas adicionales

  • Levine, John R. (2000) [octubre de 1999]. Enlazadores y cargadores . Serie Morgan Kaufmann de ingeniería de software y programación (1.ª  ed.). San Francisco, EE. UU.: Morgan Kaufmann . ISBN 1-55860-496-0. OCLC 42413382 . Consultado el 12 de enero de 2020 . {{cite book}}: CS1 maint: servicio de archivado obsoleto ( enlace ) Código: [ enlace eliminado ]Errata:
  • Enlace y carga dinámicos , IECC.com
  • Enlace dinámico en Linux y Windows, primera parte , Symantec.com
  • Anatomía de las bibliotecas dinámicas de Linux , IBM.com