Articulo de referencia

Linker (computing)

An illustration of the linking process. Object files and static libraries are assembled into a new library or executable A linker or link editor is a computer program that combi...

An illustration of the linking process. Object files and static libraries are assembled into a new library or executable

A linker or link editor is a computer program that combines intermediate software build files such as object and library files into a single executable file such as a program or library. A linker is often part of a toolchain that includes a compiler and/or assembler that generates intermediate files that the linker processes. The linker may be integrated with other toolchain tools such that the user does not interact with the linker directly.

A simpler version that writes its output directly to memory is called the loader, though loading is typically considered a separate process.[1][2]

Overview

Computer programs typically are composed of several parts or modules; these parts/modules do not need to be contained within a single object file, and in such cases refer to each other using symbols as addresses into other modules, which are mapped into memory addresses when linked for execution.

While the process of linking is meant to ultimately combine these independent parts, there are many good reasons to develop those separately at the source-level. Among these reasons are the ease of organizing several smaller pieces over a monolithic whole and the ability to better define the purpose and responsibilities of each individual piece, which is essential for managing complexity and increasing long-term maintainability in software architecture.

Typically, an object file can contain three kinds of symbols:

  • defined "external" symbols, sometimes called "public" or "entry" symbols, which allow it to be called by other modules,
  • undefined "external" symbols, which reference other modules where these symbols are defined, and
  • local symbols, used internally within the object file to facilitate relocation.

For most compilers, each object file is the result of compiling one input source code file. When a program comprises multiple object files, the linker combines these files into a unified executable program, resolving the symbols as it goes along.

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 . Consultado 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   
Retrieved from "https://en.wikipedia.org/w/index.php?title=Linker_(computing)&oldid=1362298320#Jump-sizing"