Enlazador (informática)

Programa de computadora que combina múltiples archivos de objetos en un solo archivo

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

En informática , un enlazador o editor de enlaces es un programa de sistema informático que toma uno o más archivos de objeto (generados por un compilador o un ensamblador ) y los combina en un único archivo ejecutable , archivo de biblioteca u otro archivo "objeto".

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 de computadora generalmente se componen de varias partes o módulos; estas partes/módulos no necesitan estar contenidos dentro de un único archivo de objeto y, en tales casos, se refieren entre sí usando símbolos como direcciones a otros módulos, que se asignan a direcciones de memoria cuando se vinculan para su ejecución.

Si bien el proceso de vinculación tiene como objetivo combinar en última instancia estas partes independientes, existen muchas buenas razones para desarrollarlas por separado en el 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 que es esencial para gestionar la complejidad y aumentar la capacidad de mantenimiento a largo plazo en la arquitectura de software .

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

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

Para la mayoría de los compiladores, cada archivo de objeto es el resultado de compilar un archivo de código fuente de entrada. Cuando un programa consta de varios archivos de objeto, el enlazador combina estos archivos 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 de objetos de una biblioteca estática en el ejecutable de salida; incluyen solo aquellos archivos de objetos de la biblioteca a los que hacen referencia otros archivos de objetos o bibliotecas de forma directa o indirecta. Pero en el caso de una biblioteca compartida , se debe cargar toda la biblioteca durante el tiempo de ejecución, ya que no se sabe qué funciones o métodos se llamarán durante el tiempo de ejecución. Por lo tanto, la vinculación de bibliotecas puede ser un proceso iterativo, en el que algunos módulos referenciados requieren que se vinculen módulos adicionales, y así sucesivamente. Las bibliotecas existen para diversos propósitos y, por lo general, se vinculan una o más bibliotecas del sistema de forma predeterminada.

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

El ejecutable que genera el enlazador puede necesitar otro paso de reubicación cuando finalmente se carga en la memoria (justo antes de la ejecución). Este paso generalmente se omite en el hardware que ofrece memoria virtual : cada programa se coloca en su propio espacio de direcciones, por lo que no hay conflicto incluso si todos los programas se cargan en la misma dirección base. Este paso también se puede omitir si el ejecutable es un ejecutable independiente de la posición .

En algunas variantes de Unix , como SINTRAN III , el proceso realizado por un enlazador (ensamblar archivos de objetos en un programa) se llamaba carga (como cargar código ejecutable en un archivo). [3] Además, en algunos sistemas operativos, el mismo programa maneja tanto el trabajo de enlazar como el de cargar un programa ( enlace dinámico ).

Enlace dinámico

Muchos entornos de sistemas operativos permiten la vinculación dinámica, lo que pospone la resolución de algunos símbolos no definidos hasta que se ejecuta un programa. Esto significa que el código ejecutable aún contiene símbolos no definidos, 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 o bibliotecas y se realizará una vinculación final.

Este enfoque ofrece dos ventajas:

  • Las bibliotecas de uso frecuente (por ejemplo, las bibliotecas del sistema estándar) deben almacenarse en una sola ubicación, no duplicarse en cada archivo ejecutable, ahorrando así memoria y espacio en disco limitados .
  • Si se corrige un error en una función de biblioteca reemplazando la biblioteca o se mejora el rendimiento , todos los programas que la utilicen dinámicamente se beneficiarán de la corrección después de reiniciarlos. Los programas que incluían esta función mediante un enlace estático tendrían que volver a vincularse primero.

También existen desventajas:

  • Conocida en la plataforma Windows como " el infierno de las DLL ", una biblioteca actualizada incompatible romperá los ejecutables que dependían del comportamiento de la versión anterior de la biblioteca si la versión más nueva no es correctamente compatible con versiones anteriores .
  • Un programa, junto con las bibliotecas que utiliza, podría estar certificado (por ejemplo, en cuanto a corrección, requisitos de documentación o rendimiento) como paquete, pero no si los componentes pueden reemplazarse (esto también va 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 calificado ).

Los entornos contenidos o virtuales también pueden permitir a los administradores de sistemas mitigar o compensar estos pros y contras individuales.

Enlace estático

El enlace estático es el resultado de que el enlazador copie todas las rutinas de biblioteca utilizadas en el programa en la imagen ejecutable. Esto puede requerir más espacio en disco y memoria que el enlace dinámico, pero es más portátil, ya que no requiere la presencia de la biblioteca en el sistema donde se ejecuta. El enlace estático también evita el "infierno de las DLL", ya que cada programa incluye exactamente las versiones de rutinas de biblioteca que necesita, sin conflictos con otros programas. Un programa que utiliza sólo algunas rutinas de una biblioteca no requiere que se instale toda la biblioteca.

Reubicación

Como el compilador no tiene información sobre la disposición de los objetos en la salida final, no puede aprovechar las instrucciones más cortas o más eficientes que imponen un requisito sobre la dirección de otro objeto. Por ejemplo, una instrucción de salto puede hacer referencia a una dirección absoluta o un desplazamiento desde la ubicación actual, y el desplazamiento podría expresarse con diferentes longitudes según la distancia al objetivo. 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 más eficientes durante el enlace final. Con respecto a las optimizaciones de salto, esto también se llama dimensionamiento de salto automático . [4] Este paso se puede realizar solo después de que se hayan leído todos los objetos de entrada y se hayan asignado direcciones temporales; el paso de relajación del enlazador posteriormente reasigna 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 debe sopesar las ventajas de cada opción.

Si bien la relajación de instrucciones ocurre normalmente en el momento del enlace, la relajación del módulo interno puede tener lugar ya como parte del proceso de optimización en el momento de la compilación . En algunos casos, la relajación también puede ocurrir en el momento de la carga como parte del proceso de reubicación o combinada con técnicas dinámicas de eliminación de código muerto .

Editor de enlaces

En los entornos de mainframe IBM System/360 , como OS/360 , incluido z/OS para los mainframes z/Architecture , este tipo de programa se conoce como editor de enlaces . Como su nombre lo indica, un editor de enlaces tiene la capacidad adicional de permitir la adición, el reemplazo y/o la eliminación de secciones de programa individuales. 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 pueda reemplazar una sección de programa individual y actualizar otras partes del programa para que el editor de enlaces pueda corregir direcciones reubicables y otras referencias, como parte del proceso.

Una ventaja de esto es que permite mantener un programa sin tener que mantener todos los archivos de objetos intermedios, o sin tener que volver a compilar las secciones del programa que no han cambiado. También permite que las actualizaciones del programa se distribuyan en forma de pequeños archivos (originalmente barajas de cartas ), que contienen solo el módulo de objeto que se va a reemplazar. En tales sistemas, el código de objeto tiene la forma y el formato de imágenes de tarjetas perforadas de 80 bytes, de modo que se puedan introducir actualizaciones en un sistema que utilice ese medio. En versiones posteriores de OS/360 y en sistemas posteriores, 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 agregar, cambiar o eliminar una estructura superpuesta de un módulo de carga ya vinculado.

El término "editor de enlaces" no debe interpretarse como que implica que el programa funciona en un modo interactivo con el usuario como un editor de texto. Está pensado para la ejecución en modo por lotes, con los comandos de edición suministrados por el usuario en archivos organizados secuencialmente, como tarjetas perforadas , DASD o cintas magnéticas .

La edición de enlace ( nomenclatura IBM ) o consolidación o recopilación ( nomenclatura ICL ) se refiere al acto del editor de enlace o consolidador de combinar las distintas piezas 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

Al principio, los enlazadores proporcionaban a los usuarios un control muy limitado sobre la disposición de los archivos de objetos de salida generados. A medida que los sistemas de destino se volvieron complejos con diferentes requisitos de memoria, como los sistemas integrados, se hizo necesario dar a los usuarios el control para generar archivos de objetos de salida con sus requisitos específicos, como la definición de direcciones base de segmentos. Para ello, se utilizaron scripts de control de enlazadores.

Implementaciones comunes

En sistemas Unix y similares, el enlazador se conoce como "ld". Los orígenes del nombre "ld" son "LoaDer" y "Link eDitor". El término "loader" se utilizaba para describir el proceso de carga de símbolos externos desde otros programas durante el proceso de enlace. [5]

Enlazador GNU

El enlazador GNU (o GNU ld) es la implementación de software libre del comando Unix ld del Proyecto GNU. GNU ld ejecuta el enlazador, que crea un archivo ejecutable (o una biblioteca) a partir de archivos de objetos creados durante la compilación de un proyecto de software. Se puede pasar un script enlazador a GNU ld para ejercer un mayor control sobre el proceso de enlazado. [ 6] El enlazador GNU es parte de las Utilidades binarias GNU (binutils). Se proporcionan dos versiones de ld en binutils: el tradicional GNU ld basado en bfd y una versión "simplificada" que solo utiliza ELF llamada gold .

La sintaxis de la línea de comandos y del enlazador de GNU ld es el estándar de facto en gran parte del mundo de tipo Unix . El enlazador del proyecto LLVM ,lld está diseñado para ser compatible con drop-in,[7]y puede usarse directamente con el compilador GNU. Otro reemplazo drop-in, mold, es una alternativa 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 de IBM OS (PDF) . IBM Corporation . 1972. Archivado (PDF) desde el original el 6 de marzo de 2020 . Consultado el 7 de marzo de 2020 .
  2. ^ ab 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  .(xii+100 páginas)
  3. ^ Manual del usuario de BRF-LINKER . Agosto de 1984. ND-60.196.01.
  4. ^ Salomon, David (febrero de 1993) [1992]. "8.2.3 Ajuste automático de tamaño de salto" (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.). Chicester, West Sussex, Reino Unido: Ellis Horwood Limited / Simon & Schuster International Group . págs. 237–238. ISBN 0-13-052564-2Archivado (PDF) del original el 23 de marzo de 2020. Consultado el 1 de octubre de 2008 .(xiv+294+4 páginas)
  5. ^ "1. ld". MANUAL DEL PROGRAMADOR UNIX (6.ª ed.). Mayo de 1975.
  6. ^ "GNU Binutils: scripts de enlazadores". 18 de julio de 2018. Archivado desde el 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 agrega soporte para usar el enlazador de moldes". www.phoronix.com .

Lectura adicional

  • 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 de programas (PDF) (3.ª ed.). International Business Machines Corporation . 1969-07-23 [junio de 1967]. Número de programa 360S-ED-510. Número de archivo S360-31. Formulario Y28-6610-2. Archivado desde el original (PDF) el 2007-10-01 . Consultado el 2020-03-07 .
  • Jones, Douglas W. (agosto de 1983). "Lenguaje ensamblador como código objeto". Software: práctica y experiencia . 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]. Linkers and Loaders. La serie Morgan Kaufmann sobre ingeniería de software y programación (1.ª edición). San Francisco, EE. UU.: Morgan Kaufmann . ISBN 1-55860-496-0. OCLC  42413382 . Consultado el 12 de enero de 2020 .Código: [1] Erratas: [2]
  • 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) desde el original el 2020-03-07 . Consultado el 2020-03-07 .(19 páginas)
  • Ramsey, Norman (mayo de 1996). "Reubicación de instrucciones de máquina mediante currying" (PDF) . ACM SIGPLAN Notices . 31 (5): 226–236. doi :10.1145/249069.231429. Archivado (PDF) desde el original el 18 de mayo de 2020.
  • Entradas del blog Linkers de Ian Lance Justin
  • Linkers and Loaders, un artículo de Linux Journal escrito por Sandeep Grover
  • Otra lista de dónde conseguir una colección completa de herramientas gratuitas para el desarrollo del lenguaje ensamblador
  • Manual del enlazador GNU
  • LLD - El enlazador LLVM
  • ld(1): El enlazador GNU –  Manual del usuario de Linux – Comandos del usuario
Obtenido de "https://es.wikipedia.org/w/index.php?title=Enlazador_(informática)&oldid=1241059988"