Buscar este blog

jueves, 30 de octubre de 2014

ENLAZADOR

Se podría definir un enlazador como un programa que toma los códigos objetos creados en el proceso de compilación de un programa, junto con los datos provenientes de subprogramas que se agrupan en bibliotecas, todo esto con el fin de producir un ejecutable o una biblioteca.

El proceso que lleva a cabo el enlazador comienza a r luego de una revisión sintáctica, semántica y léxica del código compilado.

El linker u enlazador permite al programador escribir su código en cualquier lenguaje de alto nivel o si así lo desea en lenguaje de bajo nivel, ya que éste (el enlazador) se encargará de transformarlo a lenguaje de máquina. Con esto, la tarea del programador se facilita tanto en la codificación como en el tiempo utilizado para escribir un programa.




FUNCION DE LOS ENLAZADORES

Los enlazadores deben de cumplir con cuatro funciones básicas, a saber:

1.    Enlazar al mismo tiempo módulos traducidos independientemente


2.    Superposición de procesamiento.

3.    Modificación del programa

4.    Acceso a las bibliotecas.


La primera función, que es la que se considera la principal, es la que permite crear un único archivo a partir de varios archivos de código de máquina relocalizable.

Estos archivos pueden haber sido el resultado de varias compilaciones distintas, y uno o varios de ellos pueden archivos de biblioteca de rutinas proporcionadas por el sistema y disponibles para cualquier programa que las necesite. Las demás funciones se consideran secundarias, sin embargo, son necesarias para el funcionamiento que se necesita de un enlazador. Gracias al acceso a bibliotecas es que podemos utilizar las clases pre compiladas que la mayoría de lenguajes de programación nos ofrece, también no se permite cambiar por módulos el programa, es decir, que si se desea cambiar solo un archivo no es necesario compilar y enlazar todo de nuevo, simplemente es necesario enlazar y compilar el código que deseamos cambiar.

ESTRUCTURA DE LOS ENLAZADORES 


Los enlazadores pueden estar estructurados de dos formas diferentes, la primera estructura corresponde a los enlazadores de una pasada, mientras que la segunda a los enlazadores de dos pasadas.

Los enlazadores de una pasada durante el procedimiento de enlace almacenan todo o parte del contenido de los archivos de entrada, en memoria o en el disco y luego en la ejecución leen ese material.

Por su parte, los enlazadores de dos pasadas, en la primera pasada el enlazador toma todos los códigos objetos creados en el proceso de compilación y todas librerías necesarias para crear el ejecutable. En esta primera etapa todos los códigos objetos que van a formar parte del ejecutable cuentan una serie de segmentos y una tabla de símbolos. La tabla de símbolos contiene símbolos importados (nombres de rutinas que son llamados desde otro archivos) o exportados (símbolos que son utilizados en el archivo pero que están definidos en otro).

A todos estos datos de entrada, el enlazador busca el tamaño de sus segmentos, las definiciones y referencias de todos los símbolos y con esta información crear una única tabla en la que se listan todos los segmentos definidos en los archivos de entrada. También crea una tabla única de símbolos que contiene tanto los símbolos importados como los símbolos exportados.

TIPOS DE ENLAZADORES 


Se puede decir que existen dos tipos de enlazadores, a saber, los enlazadores dinámicos y los enlazadores estáticos.

Los enlazadores dinámicos: son aquellos que le permiten a un programa en ejecución agregar, quitar, remplazar o realojar los módulos de objeto dentro de la dirección de memoria durante su ejecución.

Los enlazadores estáticos: el proceso de enlace sólo se lleva a cabo una vez cuando se produce el archivo ejecutable, el cual es cargado directamente en memoria cuando es ejecutado. Como se puede deducir de lo anteriormente descrito, los programas que usan enlazadores estáticos son incapaces de cambiar su estructura durante su ejecución.


GENERALIDADES DE LOS ENLAZADORES DINÁMICOS




Como se definió anteriormente los enlazadores dinámicos son aquellos que permiten que un programa modificado mientras esta en ejecución. 

Los enlazadores dinámicos se dividen en dos etapas, la etapa de enlazamiento estática y la etapa de enlazamiento en tiempo de cargado. Durante la etapa estática las rutinas de las bibliotecas utilizadas en el ejecutable creado necesitan ser referenciadas, no así definidas, ya que en la segunda etapa el enlazador se encargará de buscar y cargar todas las rutinas que no están definidas antes de pasarle el control al procedimiento principal. 

Lo anterior es el proceso que siguen en general todos los enlazadores dinámicos, ahora según el sistema operativo en el que se esté trabajando la implementación de enlazadores dinámicos va ser distinta. 

El primer enlazador dinámico que existió fue el ELF dynamic linking introducido por Sun Microsystems a principio de la década de los 80 el cual se convirtió, en la década de los 90, en estándar para los sistemas operativos unix y derivados como Linux . Por su parte Microsoft implementa sus enlazadores dinámicos mediante los dll’s, los cuales tienen prácticamente el mismo funcionamiento.


Generalidades de los Enlazadores Estáticos


En un principio los enlazadores podían ser sólo de tipo estático, sin embargo como se menciono anteriormente a partir de la década de los 80’s se logro hacer enlazadores que pudieran ser ejecutados dinámicamente. Un enlazador estático es aquel que como se mencionó anteriormente solo se produce una vez y que no permite que el programa cambie mientras está siendo ejecutado.


Los enlazadores estáticos necesitan además que todos los símbolos globales estén bien definidos y en el caso de que se deba de hacer un cambio en alguno de los objetos se debe de volver a enlazar todos los códigos objetos. Por otra parte es más eficiente en ya que es menos complicado de manejar en memoria que los enlazadores dinámicos, y además de que la tabla de símbolos es considerablemente más pequeña que los enlazadores dinámicos

Video sobre Enlazador: