stringtranslate.com

Enlazador (informática)

Una ilustración del proceso de vinculación. Los archivos objeto 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 objeto (generados por un compilador o 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 informáticos suelen estar compuestos de varias partes o módulos; No es necesario que estas partes/módulos estén contenidos en un único archivo objeto y, en tales casos, se refieren entre sí mediante 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, en última instancia, combinar estas partes independientes, existen muchas buenas razones para desarrollarlas por separado en el nivel 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:

Para la mayoría de los compiladores, cada archivo objeto es el resultado de compilar un archivo de código fuente de entrada. Cuando un programa comprende varios archivos objeto, el vinculador 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 en 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; incluyen solo aquellos archivos de objetos de la biblioteca a los que otros archivos de objetos o bibliotecas hacen referencia directa o indirectamente. Pero para una biblioteca compartida , toda la biblioteca debe cargarse 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 a los que se hace referencia requieren la vinculación de módulos adicionales, y así sucesivamente. Las bibliotecas existen para diversos fines y una o más bibliotecas del sistema suelen estar vinculadas de forma predeterminada.

El vinculador también se encarga de organizar los objetos en el espacio de direcciones de un programa . Esto puede implicar reubicar el 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 asume una ubicación base fija (por ejemplo, cero ). La reubicación del código de máquina puede implicar la reorientación de saltos, cargas y almacenes absolutos.

La salida ejecutable del vinculador puede necesitar otra pasada de reubicación cuando finalmente se carga en la memoria (justo antes de la ejecución). Este paso suele omitirse 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 pase 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 objeto en un programa) se llamaba carga (como cargar código ejecutable en un archivo). [3] Además, en algunos sistemas operativos, el mismo programa se encarga de las tareas de vincular y cargar un programa ( enlace dinámico ).

Enlace dinámico

Muchos entornos de sistemas operativos permiten enlaces dinámicos, posponiendo la resolución de algunos símbolos indefinidos hasta que se ejecuta un programa. Eso significa que el código ejecutable todavía 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/bibliotecas y se realizará un enlace final.

Este enfoque ofrece dos ventajas:

También hay desventajas:

Los entornos contenidos o virtuales pueden permitir además 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 la 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. Los enlaces estáticos también evitan el "infierno de DLL", ya que cada programa incluye exactamente las versiones de rutinas de biblioteca que requiere, sin ningún conflicto con otros programas. Un programa que utiliza sólo unas pocas rutinas de una biblioteca no requiere que se instale toda la biblioteca.

Reubicación

Como el compilador no tiene información sobre el diseño de los objetos en el resultado final, no puede aprovechar 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 dependiendo de 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 sustituirlas por instrucciones más cortas o más eficientes durante el enlace final. En lo que respecta a las optimizaciones de salto, esto también se denomina tamaño de salto automático . [4] Este paso se puede realizar solo después de que todos los objetos de entrada hayan sido leídos y asignados direcciones temporales; Posteriormente, el paso de relajación del enlazador 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 converja siempre en la mejor solución dado un orden fijo de objetos; si este no es el caso, las flexibilizaciones pueden entrar en conflicto y el vinculador debe sopesar las ventajas de cualquiera de las opciones.

Si bien la relajación de las instrucciones generalmente ocurre en el momento del enlace, la relajación del módulo interno ya puede tener lugar como parte del proceso de optimización en el tiempo de 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ódigos muertos .

editor de enlaces

En 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 agregar, reemplazar y/o eliminar secciones de programas individuales. Los sistemas operativos como OS/360 tienen un formato para módulos de carga ejecutables que contienen datos complementarios sobre las secciones componentes de un programa, de modo que se puede reemplazar una sección de programa individual y se pueden actualizar otras partes del programa para que se puedan reubicar direcciones y otras referencias. ser corregido por el editor de enlaces, como parte del proceso.

Una ventaja de esto es que permite mantener un programa sin tener que conservar todos los archivos objeto 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 únicamente el módulo objeto que se va a reemplazar. En tales sistemas, el código objeto tiene la forma y el formato de imágenes de tarjetas perforadas de 80 bytes, de modo que se pueden introducir actualizaciones en un sistema utilizando 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 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 en el sentido de que el programa funciona en modo interactivo con el usuario, como un editor de texto. Está pensado para la ejecución en modo por lotes, en el que los comandos de edición los proporciona el usuario en archivos organizados secuencialmente, como tarjetas perforadas , DASD o cintas magnéticas .

La edición de enlaces ( nomenclatura IBM ) o la consolidación o recopilación ( nomenclatura ICL ) se refiere al acto del editor o consolidador de enlaces 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 una tarea separada. paso. [2]

Scripts de control del vinculador

Al principio, los enlazadores daban a los usuarios un control muy limitado sobre la disposición de los archivos objeto 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 control para generar archivos de objetos de salida con sus requisitos específicos, como la definición de direcciones base de segmentos. Para esto se utilizaron scripts de control de enlazadores.

Implementaciones comunes

En Unix y sistemas similares a Unix, el enlazador se conoce como "ld". Los orígenes del nombre "ld" son "LoaDer" y "Link eDitor". El término "cargador" se utilizó para describir el proceso de cargar símbolos externos de otros programas durante el proceso de vinculación. [5]

enlazador GNU

El enlazador GNU (o GNU ld) es la implementación de software libre del Proyecto GNU del comando Unix ld. GNU ld ejecuta el vinculador, que crea un archivo ejecutable (o una biblioteca) a partir de archivos objeto creados durante la compilación de un proyecto de software. Se puede pasar un script de vinculación a GNU ld para ejercer un mayor control sobre el proceso de vinculación. [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" solo para ELF llamada gold .

La sintaxis de la línea de comandos y del script de enlace de GNU ld es el estándar de facto en gran parte del mundo tipo Unix . El enlazador del proyecto LLVM ,lld , está diseñado para ser compatible directamente[7]y puede usarse directamente con el compilador GNU. Otro reemplazo directo, el molde, es una alternativa altamente paralelizada y más rápida que también es compatible con las herramientas GNU. [8]

Ver también

Referencias

  1. ^ Cargador y editor de vinculación del sistema operativo IBM (PDF) . Corporación IBM . 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, Estados Unidos: Elsevier North-Holland Inc. págs. 65–66. ISBN 0-444-19462-2. LCCN  78-19961.(xii+100 páginas)
  3. ^ Manual de usuario de BRF-LINKER . Agosto de 1984. ND-60.196.01.
  4. ^ Salomon, David (febrero de 1993) [1992]. "8.2.3 Cambio de tamaño de salto automático" (PDF) . Escrito en la Universidad Estatal de California, Northridge, California, EE. UU. En Chivers, Ian D. (ed.). Ensambladores y Cargadores . Serie de Ellis Horwood sobre 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-2. Archivado (PDF) desde el 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: secuencias de comandos vinculadores". 2018-07-18. Archivado desde el original el 6 de marzo de 2020 . Consultado el 18 de enero de 2019 .
  7. ^ "LLD - El vinculador LLVM - documentación lld 14". lld.llvm.org .
  8. ^ "GCC 12 agrega soporte para el uso de Mold Linker". www.phoronix.com .

Otras lecturas

enlaces externos