Articulo de referencia

Enlazador (informática)

Una ilustración del proceso de enlace. Los archivos objeto y las bibliotecas estáticas se ensamblan en una nueva biblioteca o ejecutable. Un enlazador o editor de enlaces es un ...

Una ilustración del proceso de enlace. Los archivos objeto y las bibliotecas estáticas se ensamblan en una nueva biblioteca o ejecutable.

Un enlazador o editor de enlaces es un programa informático que combina archivos intermedios de compilación de software, como archivos objeto y de biblioteca , en un único archivo ejecutable , como un programa o una biblioteca. Un enlazador suele formar parte de una cadena de herramientas que incluye un compilador y/o un ensamblador que genera archivos intermedios que el enlazador procesa. El enlazador puede estar integrado con otras herramientas de la cadena de herramientas, de modo que el usuario no interactúa directamente con él.

Una versión más simple que escribe su salida directamente en la memoria se llama cargador , aunque la carga generalmente se considera un proceso separado. [ 1 ] [ 2 ]

Descripción general

Los programas informáticos suelen estar compuestos de varias partes o módulos; estas partes/módulos no necesitan estar contenidos en un único archivo objeto y, en tales casos, se refieren entre sí mediante símbolos que sirven como direcciones a otros módulos, los cuales se asignan a direcciones de memoria cuando se enlazan para su ejecución.

Si bien el proceso de vinculación tiene como objetivo combinar estas partes independientes, existen muchas buenas razones para desarrollarlas por separado a nivel de código fuente . Entre estas razones se encuentran la facilidad de organizar varias piezas más pequeñas en un todo monolítico y la capacidad de definir mejor el propósito y las responsabilidades de cada pieza individual, lo cual es esencial para gestionar la complejidad y aumentar la mantenibilidad a largo plazo en la arquitectura de software .

Normalmente, un archivo objeto puede contener tres tipos de símbolos:

  • Definió símbolos "externos", a veces llamados símbolos "públicos" o de "entrada", que permiten que otros módulos lo llamen,
  • símbolos "externos" indefinidos, que hacen referencia a otros módulos donde estos símbolos están definidos, y
  • Símbolos locales, utilizados internamente dentro del archivo objeto para facilitar la reubicación .

Para la mayoría de los compiladores, cada archivo objeto es el resultado de compilar un único archivo de código fuente. Cuando un programa consta de varios archivos objeto, el enlazador los combina en un programa ejecutable unificado, resolviendo los símbolos a medida que avanza.

Los enlazadores pueden tomar objetos de una colección llamada biblioteca o biblioteca de tiempo de ejecución . La mayoría de los enlazadores no incluyen todos los archivos objeto de una biblioteca estática en el ejecutable de salida; solo incluyen aquellos archivos objeto de la biblioteca a los que hacen referencia otros archivos objeto o bibliotecas, directa o indirectamente. Pero para una biblioteca compartida , toda la biblioteca debe cargarse durante el tiempo de ejecución, ya que se desconoce qué funciones o métodos se llamarán durante la ejecución. Por lo tanto, la vinculación de bibliotecas puede ser un proceso iterativo, donde algunos módulos referenciados requieren que se vinculen módulos adicionales, y así sucesivamente. Las bibliotecas existen para diversos propósitos, y una o más bibliotecas del sistema generalmente se vinculan por defecto.

El enlazador también se encarga de organizar los objetos en el espacio de direcciones de un programa . Esto puede implicar reubicar código que asume una dirección base específica a otra. Dado que un compilador rara vez sabe dónde residirá un objeto, suele asumir una ubicación base fija (por ejemplo, cero ). La reubicación del código máquina puede implicar la reorientación de saltos, cargas y almacenamientos absolutos.

El archivo ejecutable generado por el enlazador puede requerir una reubicación adicional al cargarse en memoria (justo antes de la ejecución). Esta reubicación suele omitirse en hardware con memoria virtual : cada programa se ubica en su propio espacio de direcciones, evitando así conflictos incluso si todos se cargan en la misma dirección base. Esta reubicación también puede omitirse si el ejecutable es independiente de la posición .

Además, en algunos sistemas operativos, el mismo programa se encarga tanto de enlazar como de cargar un programa ( enlace dinámico ).

Enlace dinámico

Muchos sistemas operativos permiten el enlace dinámico, lo que retrasa la resolución de algunos símbolos indefinidos hasta que se ejecuta el programa. Esto significa que el código ejecutable aún contiene símbolos indefinidos, además de una lista de objetos o bibliotecas que proporcionarán definiciones para estos. Al cargar el programa, también se cargarán estos objetos/bibliotecas y se realizará el enlace final.

Este enfoque ofrece dos ventajas:

  • Las bibliotecas de uso frecuente (por ejemplo, las bibliotecas estándar del sistema) deben almacenarse en una sola ubicación, sin duplicarse en cada archivo ejecutable, lo que permite ahorrar memoria y espacio en disco , que son recursos limitados.
  • Si se corrige un error en una función de la biblioteca reemplazando la biblioteca o mejorando su rendimiento , todos los programas que la utilicen dinámicamente se beneficiarán de la corrección tras reiniciarlos. Los programas que incluyeron esta función mediante enlace estático tendrían que volver a enlazarse primero.

También existen algunas desventajas:

  • Conocido en la plataforma Windows como " el infierno de las DLL ", una biblioteca actualizada incompatible provocará fallos en los ejecutables que dependían del comportamiento de la versión anterior de la biblioteca si la versión más reciente no es correctamente compatible con versiones anteriores .
  • Un programa, junto con las bibliotecas que utiliza, puede estar certificado (por ejemplo, en cuanto a corrección, requisitos de documentación o rendimiento) como un paquete, pero no si los componentes pueden reemplazarse (esto también argumenta en contra de las actualizaciones automáticas del sistema operativo en sistemas críticos; en ambos casos, el sistema operativo y las bibliotecas forman parte de un entorno cualificado ).

Los entornos confinados o virtuales pueden permitir además a los administradores de sistemas mitigar o sopesar estas ventajas e inconvenientes individuales.

Enlace estático

El enlace estático consiste en que el enlazador copia todas las rutinas de la biblioteca utilizadas en el programa dentro del archivo ejecutable. Esto puede requerir más espacio en disco y memoria que el enlace dinámico, pero es más portable, ya que no requiere la presencia de la biblioteca en el sistema donde se ejecuta. El enlace estático también evita el problema de las bibliotecas incompatibles, puesto que cada programa incluye exactamente las versiones de las rutinas de la biblioteca que necesita, sin conflictos con otros programas. Un programa que utiliza solo algunas rutinas de una biblioteca no requiere que se instale la biblioteca completa.

Reubicación

Como el compilador no tiene información sobre la disposición de los objetos en la salida final, no puede aprovechar instrucciones más cortas o eficientes que requieran la dirección de otro objeto. Por ejemplo, una instrucción de salto puede hacer referencia a una dirección absoluta o a un desplazamiento desde la ubicación actual, y el desplazamiento podría expresarse con diferentes longitudes según la distancia al destino. Al generar primero la instrucción más conservadora (generalmente la variante relativa o absoluta más grande, según la plataforma) y agregar sugerencias de relajación , es posible sustituir instrucciones más cortas o eficientes durante el enlace final. En lo que respecta a las optimizaciones de salto, esto también se denomina dimensionamiento automático de salto . [ 3 ] Este paso solo se puede realizar después de que todos los objetos de entrada se hayan leído y asignado direcciones temporales; la fase de relajación del enlazador posteriormente reasigna las direcciones, lo que a su vez puede permitir que se produzcan más relajaciones potenciales. En general, las secuencias sustituidas son más cortas, lo que permite que este proceso siempre converja en la mejor solución dado un orden fijo de objetos; si este no es el caso, las relajaciones pueden entrar en conflicto y el enlazador necesita sopesar las ventajas de cada opción.

Si bien la relajación de instrucciones suele ocurrir en tiempo de enlace, la relajación dentro del módulo puede tener lugar como parte del proceso de optimización en tiempo de compilación . En algunos casos, la relajación también puede ocurrir en tiempo de carga como parte del proceso de reubicación o combinada con técnicas de eliminación dinámica de código muerto .

editor de enlaces

En los sistemas operativos para mainframes IBM System/360 a IBM Z, como OS/360 y sus sucesores , este tipo de programa se conoce como editor de enlaces . Como su nombre indica, un editor de enlaces tiene la capacidad adicional de permitir la adición, el reemplazo o la eliminación de secciones individuales del programa. Los sistemas operativos como OS/360 tienen un formato para módulos de carga ejecutables que contienen datos complementarios sobre las secciones de componentes de un programa, de modo que se puede reemplazar una sección individual del programa y actualizar otras partes del programa para que el editor de enlaces pueda corregir las direcciones reubicables y otras referencias como parte del proceso.

Una ventaja de esto es que permite mantener un programa sin tener que conservar todos los archivos objeto intermedios ni recompilar secciones del programa que no hayan cambiado. También permite distribuir las actualizaciones del programa en forma de archivos pequeños (originalmente mazos de tarjetas ) que contienen solo el módulo objeto que se va a reemplazar. En estos sistemas, el código objeto tiene el formato de imágenes de tarjetas perforadas de 80 bytes, lo que permite introducir actualizaciones en el sistema utilizando este medio. En versiones posteriores de OS/360 y en sistemas subsiguientes, los módulos de carga contienen datos adicionales sobre las versiones de los módulos de componentes, para crear un registro rastreable de las actualizaciones. También permite añadir, modificar o eliminar una estructura de superposición de un módulo de carga ya vinculado.

El término "editor de enlaces" no debe interpretarse como que el programa funcione en modo interactivo con el usuario, como un editor de texto. Está diseñado para ejecutarse en modo por lotes, donde el usuario introduce los comandos de edición en archivos organizados secuencialmente, como tarjetas perforadas , DASD o cintas magnéticas .

La edición de enlaces ( nomenclatura de IBM ) o la consolidación o recopilación ( nomenclatura de ICL ) se refiere al acto del editor de enlaces o consolidador de combinar las distintas partes en un binario reubicable, mientras que la carga y reubicación en un binario absoluto en la dirección de destino normalmente se considera un paso separado. [ 2 ]

scripts de control del enlazador

Los primeros enlazadores ofrecían a los usuarios un control muy limitado sobre la organización de los archivos objeto de salida generados. A medida que los sistemas de destino se volvieron más complejos y con diferentes requisitos de memoria, como en los sistemas embebidos, se hizo necesario que los usuarios pudieran generar archivos objeto de salida con sus requisitos específicos, como la definición de las direcciones base de los segmentos. Para ello, se utilizaron scripts de control del enlazador.

Implementaciones destacadas

Unix y sistemas similares a Unix

En los sistemas Unix y similares, el enlazador estático se suele invocar mediante el comando ld, que es una abreviatura de LoaDer o Link eDitor . El término "cargador" se utilizaba para describir el proceso de carga de símbolos externos de otros programas durante el proceso de enlace. [ 4 ] (Esta terminología también se ha utilizado en otros sistemas operativos. Por ejemplo, en SINTRAN III , el enlace (ensamblaje de archivos objeto en un programa) se denominaba carga , como en la carga de código ejecutable en un archivo. [ 5 ] )

ÑU

GNU ld, parte de GNU Binary Utilities (binutils), es la versión del Proyecto GNU del enlazador estático de Unix. Se puede pasar un script de enlazador a GNU ld para ejercer un control granular del proceso de enlace. [ 6 ] En binutils se proporcionan dos versiones de ld: el tradicional GNU ld basado en bfd y una versión optimizada solo para ELF llamada gold .

El enlazador del proyecto LLVM ,lld está diseñado para ser compatible directamente [ 7 ] y puede usarse directamente con el compilador GNU. Otra alternativa compatible, mold, es una opción altamente paralelizada y más rápida que también es compatible con las herramientas GNU [ 8 ] .

Véase también

Referencias

  1. Editor y cargador de enlaces del sistema operativo de IBM (PDF) . IBM Corporation . 1972. Archivado (PDF) del original el 6 de marzo de 2020. Consultado el 7 de marzo de 2020 .
  2. 1 2 Barron, David William (1978) [1971, 1969]. "5.7. Editores y consolidadores de enlaces". Escrito en la Universidad de Southampton , Southampton, Reino Unido. En Floretin, J. John (ed.). Ensambladores y cargadores . Monografías informáticas (3.ª ed.). Nueva York, EE. UU.: Elsevier North-Holland Inc. págs. 65–66 . ISBN   0-444-19462-2. LCCN 78-19961 . 
  3. Salomon, David (febrero de 1993) [1992]. "8.2.3 Dimensionamiento automático de saltos" (PDF) . Escrito en la Universidad Estatal de California, Northridge, California, EE. UU. En Chivers, Ian D. (ed.). Ensambladores y cargadores . Serie Ellis Horwood en computadoras y sus aplicaciones (1.ª ed.). Chichester, West Sussex, Reino Unido: Ellis Horwood Limited / Simon & Schuster International Group . págs. 237–238 . ISBN   0-13-052564-2. Archivado (PDF) del original el 23-03-2020 . Recuperado el 01-10-2008 .(xiv+294+4 páginas)
  4. Manual del programador de Unix, versión 6ld(1)  
  5. Manual de usuario de BRF-LINKER . Agosto de 1984. ND-60.196.01.
  6. "GNU Binutils: Scripts del enlazador" . 18 de julio de 2018. Archivado del original el 6 de marzo de 2020. Consultado el 18 de enero de 2019 .
  7. "LLD - El enlazador LLVM — documentación de lld 14" . lld.llvm.org .
  8. "GCC 12 añade soporte para usar el enlazador Mold" . www.phoronix.com .

Lecturas adicionales

  • Fraser, Christopher W.; Hanson, David R. (abril de 1982). "Un enlazador independiente de la máquina". Software: Práctica y experiencia . 12 (4). John Wiley & Sons Ltd : 351–366 . doi : 10.1002/spe.4380120407 . ISSN 1097-024X . S2CID 206508204 .  
  • Sistema Operativo 360 - Editor de Enlaces (E) - Manual de Lógica del Programa (PDF) (3.ª ed.). International Business Machines Corporation . 23 de julio de 1969 [junio de 1967]. Número de programa 360S-ED-510. Número de archivo S360-31. Formulario Y28-6610-2. Archivado del original (PDF) el 1 de octubre de 2007. Consultado el 7 de marzo de 2020 .
  • Jones, Douglas W. (agosto de 1983). "Lenguaje ensamblador como código objeto". Software: Practice and Experience . 13 (8). John Wiley & Sons Ltd : 715–725 . doi : 10.1002/spe.4380130806 . ISSN 1097-024X . S2CID 42995338 .  
  • 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 . Código:Erratas:
  • Presser, Leon ; White, John R. (septiembre de 1972). "Linkers and Loaders" (PDF) . ACM Computing Surveys . 4 (3). Universidad de California, Santa Bárbara, California, EE. UU.: 149–167 . doi : 10.1145/356603.356605 . S2CID 5694671. Archivado (PDF) del original el 7 de marzo de 2020. Recuperado el 7 de marzo de 2020 . (19 páginas)
  • Ramsey, Norman (mayo de 1996). "Reubicación de instrucciones de máquina mediante currificación" (PDF) . ACM SIGPLAN Notices . 31 (5): 226–236 . doi : 10.1145/249069.231429 . Archivado (PDF) del original el 18 de mayo de 2020.
  • Entradas del blog Linkers de Ian Lance Taylor
  • Enlazadores y cargadores , un artículo de Sandeep Grover en Linux Journal.
  • Otro listado de dónde obtener una colección completa de herramientas gratuitas para el desarrollo en lenguaje ensamblador.
  • Manual del enlazador GNU
  • LLD - El enlazador de LLVM
  • ld(1)El enlazador GNU Manual de usuario de Linux – Comandos de usuario de Manned.org