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 solo 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 contenidas dentro de un solo archivo de objeto , y en tales casos se refieren entre sí por medio de símbolos como direcciones en otros módulos, que se mapean en direcciones de memoria cuando se vinculan para su ejecución. Normalmente, un archivo de objeto puede contener tres tipos de símbolos:
- símbolos "externos" definidos, a veces denominados 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 de objeto para facilitar la reubicación .
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 de objeto, el vinculador combina estos archivos en un programa ejecutable unificado, resolviendo los símbolos a medida que avanza.
Los vinculadores pueden tomar objetos de una colección llamada biblioteca o biblioteca en tiempo de ejecución . La mayoría de los enlazadores no incluyen toda la biblioteca en la salida; incluyen sólo los archivos [ aclaración necesaria ] a los que hacen referencia otros archivos de objeto o bibliotecas. Por tanto, la vinculación de bibliotecas puede ser un proceso iterativo, con algunos módulos referenciados que 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 enlazador también se encarga de organizar los objetos en el espacio de direcciones de un programa . Esto puede implicar la reubicación de 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 la máquina puede implicar la reorientación de saltos absolutos, cargas y tiendas.
La salida ejecutable del enlazador puede necesitar otra pasada de reubicación cuando finalmente se cargue 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. Esta pasada también puede omitirse 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 objeto en un programa) se llama carga (como cargar código ejecutable en un archivo). [3] Además, en algunos sistemas operativos, el mismo programa maneja los trabajos de vinculación y carga de un programa ( vinculación dinámica ).
Vinculación dinámica
Muchos entornos de sistemas operativos permiten la vinculación dinámica, aplazando 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 indefinidos, además de una lista de objetos o bibliotecas que proporcionarán definiciones para estos. La carga del programa también cargará estos objetos / bibliotecas y realizará un enlace 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, lo que ahorra memoria y espacio en disco limitados .
- Si un error en una función de biblioteca se corrige reemplazando la biblioteca, todos los programas que la usen dinámicamente se beneficiarán de la corrección después de reiniciarlos. Los programas que incluían esta función mediante enlaces estáticos tendrían que volver a vincularse primero.
También hay desventajas:
- Conocida en la plataforma Windows como " DLL hell ", 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 reciente no es compatible con versiones anteriores de manera incorrecta .
- 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 SO y las bibliotecas forman parte de un entorno calificado ).
Enlace estático
El enlace estático es el resultado de que el enlazador copia 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 la vinculación dinámica, pero es más portátil, ya que no requiere la presencia de la biblioteca en el sistema donde se ejecuta. La vinculación estática también previene el "infierno de DLL", ya que cada programa incluye exactamente las versiones de rutinas de biblioteca que requiere, sin conflicto con otros programas. Un programa que utiliza solo 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 la salida final, no puede aprovechar instrucciones más breves o más eficientes que imponen un requisito en 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 sustituir 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 solo se puede realizar después de que se hayan leído todos los objetos de entrada y se hayan asignado direcciones temporales; el pase de relajación del enlazador reasigna posteriormente 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 debe sopesar las ventajas de cualquiera de las opciones.
Mientras que la relajación de instrucciones ocurre típicamente en tiempo de enlace, la relajación del módulo interno ya 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 entornos de mainframe IBM System / 360 como OS / 360 , incluido z / OS para 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, reemplazo y / o eliminación de secciones individuales del programa. Los sistemas operativos como OS / 360 tienen formato para módulos de carga ejecutables que contienen datos suplementarios sobre las secciones de 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 las direcciones reubicables y otras referencias puedan ser reemplazadas. ser corregido por el editor de vínculos, como parte del proceso.
Una ventaja de esto es que permite mantener un programa sin tener que conservar 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 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 las actualizaciones se pueden introducir 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 de superposición de un módulo de carga ya vinculado.
El término "editor de enlaces" no debe interpretarse en el sentido de que el programa opera en un modo interactivo con el usuario como un editor de texto. Está diseñado para la ejecución en modo por lotes, con los comandos de edición proporcionados por el usuario en archivos organizados secuencialmente, como tarjetas perforadas , DASD o cinta magnética , y las cintas se usaban a menudo durante la instalación inicial del sistema operativo.
La edición de enlace ( nomenclatura de IBM ) o la consolidación o recopilación ( nomenclatura de ICL ) se refiere al acto del editor de enlace o del consolidador de combinar las diversas piezas en un binario reubicable, mientras que la carga y reubicación en un binario absoluto en la dirección de destino se considera normalmente una paso. [2]
Enlazador GNU
El enlazador GNU (o GNU ld) es la implementación del proyecto GNU del comando Unix ld. GNU ld ejecuta el enlazador, 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 enlace a GNU ld para ejercer un mayor control sobre el proceso de enlace. [5] El enlazador GNU es parte de GNU Binary Utilities (binutils). En binutils se proporcionan dos versiones de ld: la tradicional GNU ld basada en bfd y una versión solo para ELF llamada gold .
Los posibles orígenes del nombre "ld" son " LoaD " y "Link eDitor". [6] [ fuente no confiable? ]
El enlazador GNU es software libre , distribuido bajo los términos de la Licencia Pública General GNU .
Ver también
- Biblioteca de descriptores de archivos binarios (libbfd)
- Compilar e ir al sistema
- DLL infierno
- Enlace directo
- Enlace dinámico
- Eliminación dinámica de códigos muertos
- Despacho dinámico
- Biblioteca dinámica
- Enlazador dinámico
- Carga dinámica
- Biblioteca de vínculos dinámicos
- Biblioteca
- Cargador
- Decoración de nombre
- Previnculación (previnculación)
- Reubicación
- Vinculación inteligente
- Biblioteca estática
- oro (enlazador)
Referencias
- ^ Cargador y editor de vínculos del sistema operativo IBM (PDF) . IBM Corporation . 1972. Archivado (PDF) desde el original el 6 de marzo de 2020 . Consultado el 7 de marzo de 2020 .
- ^ a b 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 de computadora (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)
- ^ BRF-LINKER Manual de usuario . Agosto de 1984. ND-60.196.01.
- ^ Salomon, David (febrero de 1993) [1992]. "8.2.3 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 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-2. Archivado (PDF) desde el original el 23 de marzo de 2020 . Consultado el 1 de octubre de 2008 . (xiv + 294 + 4 páginas)
- ^ "GNU Binutils: Scripts del enlazador" . 2018-07-18. Archivado desde el original el 6 de marzo de 2020 . Consultado el 18 de enero de 2019 .
- ^ Abusalimov, Eldar (14 de enero de 2012). "En archivos MAKE, ¿qué significan CC y LD?" . Archivado desde el original el 6 de marzo de 2020 . Consultado el 21 de enero de 2017 .
Otras lecturas
- Fraser, Christopher W .; Hanson, David R. (abril de 1982). "Un enlazador independiente de la máquina". Software: práctica y experiencia . John Wiley & Sons Ltd . 12 (4): 351–366. doi : 10.1002 / spe.4380120407 . ISSN 1097-024X . S2CID 206508204 .
- Operating System 360 - Linkage Editor (E) - Program Logic Manual (PDF) (3 ed.). Corporación de Máquinas de Negocios Internacionales . 1969-07-23 [junio de 1967]. Número de programa 360S-ED-510. Archivo No. S360-31. Formulario Y28-6610-2. Archivado desde el original (PDF) el 2007-10-01 . Consultado el 7 de marzo de 2020 .
- Jones, Douglas W. (agosto de 1983). "Lenguaje ensamblador como código objeto". Software: práctica y experiencia . John Wiley & Sons Ltd . 13 (8): 715–725. doi : 10.1002 / spe.4380130806 . ISSN 1097-024X . S2CID 42995338 .
- Levine, John R. (2000) [octubre de 1999]. Enlazadores y cargadores . La Serie Morgan Kaufmann en Ingeniería de Software y Programación (1 ed.). San Francisco, Estados Unidos: Morgan Kaufmann . ISBN 1-55860-496-0. OCLC 42413382 . Archivado desde el original el 5 de diciembre de 2012 . Consultado el 12 de enero de 2020 .Código: [1] [2] Errata: [3]
- Presser, Leon ; White, John R. (septiembre de 1972). "Enlazadores y cargadores" (PDF) . Encuestas de computación ACM . Universidad de California, Santa Bárbara, California, Estados Unidos. 4 (3): 149-167. doi : 10.1145 / 356603.356605 . S2CID 5694671 . Archivado (PDF) desde el original el 7 de marzo de 2020 . Consultado el 7 de marzo de 2020 . (19 páginas)
- Ramsey, Norman (mayo de 1996). "Reubicación de las instrucciones de la máquina mediante curry" (PDF) . Avisos ACM SIGPLAN . 31 (5): 226-236. doi : 10.1145 / 249069.231429 . Archivado (PDF) desde el original el 18 de mayo de 2020.
enlaces externos
- Entradas del blog Linkers de Ian Lance Justin
- Linkers and Loaders , un artículo de Linux Journal de Sandeep Grover
- Otro listado de dónde obtener una colección completa de herramientas gratuitas para el desarrollo del lenguaje ensamblador
- Manual del enlazador GNU
- LLD - El vinculador LLVM
- : El enlazador GNU - Manual de comandos de usuario de Linux