¡Esta es una revisión vieja del documento!
Tabla de Contenidos
Guía de supervivencia del enlazador
Descargo
Esta guía no pretende ser un texto que trate de forma exhaustiva los por menores de los métodos de enlace, su asociación con la interfaz binaria de la aplicación específica de una arquitectura ABI x86-64 ABI ARM, así como la sintaxis del GNU LD, sino que empleará un enfoque meramente práctico para la resolución de los ejercicios requeridos por la materia, haciendo incapie en algunos conceptos útiles que deben ser comprendidos para la formación del futuro ingeniero.
Introducción
La guía solo cubre la sintaxis GNU LD, la ABI x86-64 desarrollada por el Tool Interface Standards (TIS) del)UNIX System Laboratories. Para una mejor comprensión de los conceptos que se brindarán, el lector debe estar familirizado con los siguiente temas
- Etapas de la generación de un binario ejecutable (ensamblar, compilar, preprocesar, enlazar)
- Executable and Linking Format (ELF)
- Manejo básico del lenguaje ensamblador.
Misión de un enlazador
El enlazador tiene por objetivo combinar varios fragmentos de código y datos en un único fichero binario, el cual puede presentar la misma organización de la memoria en la cual se carga, por ejemplo una ROM, o diferir virtualmente como es el caso de la RAM. Vale la pena aclarar que también es posible que la organizacion de la memoria de carga (ROM) coincida con la virtual (RAM).
Lo expresado anteriormente puede comprenderse claramente mediante el siguiente ejemplo.
Se desea realizar un programa que modifique 4MB de memoria a '0', que previamente pueden estar inicializados en cualquier valor, sabiendo que el sistema solo cuenta con una ROM de 1kB y una RAM de 8MB. Antes de continuar leyendo reflexione sobre lo siguiente * Elabore mentalmente un programa que cumpla con el objetivo propuesto, sabiendo que el sistema no dispone de ningún SO. * ¿Donde se encuentra el programa durante la ejecución? * ¿Como llegó a la ubicación de la respuesta anterior? * ¿Que tamaño, aunque más no sea basandose en el tamaño de los datos, estima que tendría el programa?
#define MEM_4MB (4*1024*1024) char mem_ptr_a[MEM_4MB]={'C','h','r','i','s','t','i','a','N'}; /*Algunos elementos inicializados a algun valor*/ int main(void) { unsigned int contador; for(contador=0; contador<MEM_4MB; contador++) { mem_ptr_a[contador]=0; } }
Resulta evidente que el binario generado ocupará al menos 4MBytes, por lo cual no cabrá en la ROM del sistema. Para solventar el problema mencionado se propone:
char mem_ptr_c[]="ChristiaN"; int main(void) { unsigned int contador; for(contador=0; contador<MEM_4MB; contador++) { mem_ptr_c[contador]=0; } }
El código propuesto genera un binario con el siguiente mapa de memoria simplificado.
| ROM | |
|---|---|
| 0x0000 | |
| CODIGO | 0x0034 0x005D |
| DATOS | 0x0060 0x006A |
| 0x0400 | |
A partir del mismo se aprecia que no es posible utilizar este binario como código de arranque de nuestro sistema ya que la familia de procesadores Intel IA32 requieren que el mismo se encuentre a partir de la dirección 0xFFFF0, es decir, que el mapa de memoria necesario seria
| ROM | |
|---|---|
| 0xFFBFF | |
| DATOS | DAT_INI DAT_FIN |
| CODIGO | COD_INI COD_FIN |
| 0xFFFF0 | |
Como puede observarse no solo es necesario alterar el orden de la sección de datos y código sino que también, se deben modificar las direcciones de los punteros de datos y las llamadas a función.
Para resolver esta clase de problemas se utiliza el enlazador. Sin más preámbulos a continuación se explicará como realizar estas operaciones.
— ChristiaN 2015/03/12 20:41
FAQ
- ¡No tengo conocimiento de ensamblador, pero si de C ¿puedo leer esta guía?
Si dispone de un buen conocimiento de ELF y de como C gestiona los diferentes tipos de datos, los conceptos brindados serán comprensibles
- ¡No tengo conocimiento de ensamblador ni de si de C, pero se muchisimo de Java ¿puedo leer esta guía?
Si puede leerla, pero no la entenderá
- ¡Soy especialista en Phyton, Visual Basic y #C ¿puedo leer esta guía?


