Beruflich Dokumente
Kultur Dokumente
Es un programa que enlaza todos los programas o mdulos obteniendo lo que denominamos programa ejecutable. Es un programa que enlaza distintos mdulos o programas que poseen subprogramas. Adems incorporan las denominadas rutinas de libreras en caso de solicitarlas el propio programa. La generacin de un mdulo ejecutable a partir de una coleccin de procedimientos traducidos independientemente requiere un ligador.
FUNCIN
Los editores de ligado pueden efectuar varias funciones ltimas a dems de la simple preparacin de un programa objeto para su ejecucin estos tambin se pueden utilizar para construir paquetes de subrutinas u otras secciones que suelen utilizar juntas. Esto puede ser til al tratar con bibliotecas de subrutinas que manejan lenguajes de programacin de alto nivel. Comparados con los cargadores de ligadores los editores de ligado en general tienden a ofrecer mayor flexibilidad y control con el correspondiente incremento e complejidad y sobrecarga.
La tarea principal del enlazador es resolver referencias externas lleva a cabo la siguiente etapa del proceso de traduccin enlazando los mdulos ensambladores y los acervos para formar un programa completo. En algunos sistemas el cargador simplemente copia el programa ejecutable a las posiciones de memorias apropiadas. Sus principales funciones son: Enlazar cdigo intermedio compilado independientemente en un solo mdulo de carga resolviendo las diferencias entre Tokens.
Incorpora las denominadas rutinas de libreras en caso de solicitarlas el propio programa. Su funcin es reducir procedimientos traducidos por separado y enlazarlos para que se ejecuten como una unidad llamada programa binario ejecutable.
LIGADOR DINAMICO.
El ligador dinmico ofrece algunas ventajas sobre los otros tipos de ligado. Proporciona la posibilidad de cargar las rutinas slo cuando y si se necesitan. Si las subrutinas son grandes o tienen muchas referencias externas, se pueden conseguir ahorros considerables de tiempo y espacio de memoria. Cuando se utiliza el ligador dinmico, la asociacin de una direccin real y el nombre simblico de la rutina llamada no se hace hasta que se ejecuta la proposicin llamada.
LIGADORES ESTATICOS.
Cuando se utilizan subrutinas en un programa, el cdigo ejecutable de cada una de ellas debe encontrarse en memoria al tiempo de ejecucin. Para esto, antes de cargar un programa, debe ligarse su cdigo objeto con los cdigos objeto (guardados en uno o ms archivos) de cada una de las subrutinas invocadas por l, obteniendo as un
programa ejecutable que contiene tanto el cdigo del mdulo invocador como el cdigo de los mdulos invocados. En este punto, es posible guardar el resultado del proceso de liga en un archivo que podr ser utilizado por un cargador, o el mismo programa ligador puede tambin realizar la tarea de carga. Esto ltimo evita el tener que guardar el cdigo ejecutable en un archivo, con lo que se ahorra espacio en disco. Este ahorro de espacio en disco se paga con el tiempo gastado al tener que ligar todos los mdulos cada vez que se necesite ejecutar el programa.
LIGADURAS DE SUBRUTINAS
Al estudiar subrutinas es conveniente identificar dos funciones distintas: el invocador y el invocado. El invocador: es la seccin de cdigo que inicia la llamada a la subrutina. El invocado: es la subrutina llamada por el invocador. Examinaremos las transferencias de control necesarias para implantar la invocacin de subrutinas. Al efectuar una llamada se transfiere el control al cuerpo de la subrutina; cuando esta concluye, devuelve el control a la instruccin que est inmediatamente despus de la llamada a la subrutina desde diversos puntos en el programa, las subrutinas deben ser capaces de regresar a distintos lugares del programa. La direccin de retorno es la direccin de la instruccin que esta inmediatamente despus de la instruccin que transfiere el control al invocado. El invocador proporciona la direccin del retorno al invocado como parte de enlace de la subrutina. El enlace de subrutina es la estructura con que se comparte informacin sobre el invocador y el invocado. El invocador establece parte del enlace de subrutina en una secuencia de instrucciones llamada secuencia de arranque. El invocado establece lo que resta del enlace de subrutina en el prologo de subrutina, el cul puede estar vaco como suponemos de todas las rutinas estn bien estructuradas, las instrucciones al final de la subrutina regresan al invocador. Est secuencia de instrucciones se denomina eplogo de subrutina. Cuando el control regresa al invocador, es posible que este tenga que limpiar el enlace; este conjunto de instrucciones se denomina secuencia de limpieza y tambin puede estar vaca.
LIGADOR EN C++
Si algn archivo fuente hace referencia a funciones de una biblioteca o de funciones que estn definidas en otros archivos fuentes, el ligador combina estas funciones (con main ()) para crear un archivo ejecutable. Las referencias a variables externas en esta etapa son resueltas.
CREACIN DE UNA BIBLIOTECA ESTTICA Si se tiene un conjunto de rutinas que se usen en forma frecuente, se podra desear agruparlas en un conjunto de archivos fuente, compilar cada archivo fuente en un archivo objeto, y entonces crear una biblioteca con los archivos objeto. Supongamos que se tiene un conjunto de archivos que contengan rutinas que son usadas frecuentemente, por ejemplo un archivo cubo.c: float cubo(float x) { return (x*x*x); } y otro archivo factorial.c int factorial(int n) { int i, res=1; for(i=1; i<=n; i++) res*=i; return (res); } Para los archivos de nuestras funciones tambin se debe tener un archivo de cabecera, para que puedan ser usadas, suponiendo que se tiene el siguiente archivo libmm.h con el siguiente contenido: externfloat cubo (float); externint factorial (int);
El cdigo que use la biblioteca que se esta creando podra ser: /* Programa prueba.c */ #include "libmm.h" #define VALOR 4 main() { printf("El cubo de %d es %fn",VALOR, cubo(VALOR) ); printf("t y su factorial es %dn",factorial(VALOR) ); } Para crear la biblioteca se deben compilar los archivos fuente, que lo podemos hacer de la siguiente forma: $ gcc -c cubo.c factorial.c Lo cual nos dejar los archivos cubo.o y factorial. o. Despus se debe crear la biblioteca con los archivos fuentes, suponiendo que nuestra biblioteca se llame libmm.a, tendrs que hacerlo con el comando ar as: $ ar r libmm.a cubo.o factorial. O Cuando se actualiza una biblioteca, se necesita borrar el archivo anterior (libmm.a). El ltimo paso es crear un ndice para la biblioteca, lo que permite que el ligador pueda encontrar las rutinas. Lo anterior, lo hacemos con el comando ranlib, por lo que teclearemos ahora: $ ranlib libmm.a Los ltimos dos pasos pudieron ser combinados en uno slo, entonces hubiramos podido teclear: $ar rs libmm.a cubo.o factorial. O
Ahora que ya tenemos la biblioteca, es conveniente que coloquemos nuestra biblioteca y el archivo cabecera en algn lugar apropiado. Supongamos que dejamos la biblioteca en ~/lib y el fichero cabecera en ~/include, debemos hacer lo siguiente: $ mkdir../include $ mkdir ../lib $ mv libmm.h ../include $ mv libmm.a ../lib Si llegars a modificar la biblioteca, tendras que repetir la ltima instruccin. Se debe ahora compilar el archivo con la biblioteca, de la siguiente forma: gcc -I../include -L../lib -o prueba prueba.c lmm
El cdigo de la biblioteca compartida necesita ser independiente de la posicin, para hacer posible que sea usado el cdigo por varios programas. Para crear la biblioteca hacerlo de la siguiente forma: $ gcc -c -fPIC cubo.c factorial.c Para generar la biblioteca dinmica hacer lo siguiente: $ gcc -shared -o libmm.so cubo.o factorial. O No existe un paso para la indexacin como ocurre en las bibliotecas estticas. Despus habr que mover la biblioteca dinmica a su directorio correspondiente (../lib) y proceder a compilar para que nuestro cdigo use la biblioteca. $ gcc -I../include -L../lib -o prueba prueba.c lmm Nos preguntamos que sucede si hay una biblioteca compartida (libmm.so) y una esttica (libmm.a) disponibles. En este caso, el ligador siempre toma la compartida. Si se desea hacer uso de la esttica, se tendr que nombrar explcitamente en la lnea de comandos: $ gcc -I../include -L../lib -o prueba prueba.c libmm.a Cuando se usan bibliotecas compartidas un comando til es ldd, el cual nos informa que bibliotecas compartidas un programa ejecutable usa, a continuacin un ejemplo: Como se ve en cada lnea aparece el nombre de la biblioteca, el camino completo a la biblioteca que es usada, y donde en el espacio de direcciones virtuales la biblioteca esta mapeada.
EJEMPLOS Escribe, compila y corre el siguiente programa. Modifica el programa para que incluyas tu nombre y la forma como hiciste lo anterior. Para iniciar un comentario usa /* y para terminarlo */: main() { int i;
El siguiente programa usa la biblioteca matemtica. Teclalo, complalo y ejectalo. Incluye con comentarios dentro del programa tu nombre y la forma como hiciste lo anterior. #include <math.h> main() { int i; printf("tAngulottSenonn");
La principal estructura de datos necesaria para el cargador ligador es una tabla de smbolos externos TABSE. Esta tabla, anloga a TABSIM del algoritmo del ensamblador, se usa par almacenar el nombre y la direccin de los smbolos externos en el conjunto de secciones de control que se est cargando. Otras dos variables importantes son DIRPROG (direccin de carga del programa) y DIRSC (direccin de la seccin de control). DIRPROG es la direccin inicial de la memoria
donde se va a cargar el programa ligado, DIRSC contiene la direccin inicial asignada a la seccin de control que est examinando el cargador.