2010-04-15 10 views

Respuesta

6

Se crea un espacio de tamaño interno en una sección de datos, con el valor 5 codificado y se agrega un símbolo global sin función llamado 'aglobal' a la tabla de símbolos que lo señala. Las referencias a aglobal se convierten en reubicaciones que se resuelven en tiempo de enlace para apuntar a ese bloque de datos, por lo que en una imagen completamente enlazada las instrucciones se cargarán directamente desde ese punto en la memoria que contiene el valor 5

Por ejemplo, (x86) de montaje podría ser algo como:

.data 
.globl aglobal 
aglobal: .long 5 

.text 
main: 
    mov eax, aglobal 

en un fichero objeto, la instrucción MOV se convertirán en mov eax, 0 con una reubicación R_386_32 aglobal+0, debido a que el archivo de objeto no sabe a ciencia cierta donde la sección de datos estará en memoria.

En una imagen vinculada totalmente, podría ser algo como:

mov eax, 0x804a010 

Ahora la dirección real de los 4 bytes en la sección de datos es conocido, por lo que se especifica directamente

+0

Gracias Esto ayuda. Corrígeme si estoy equivocado ... Así que si leer o escribir en aglobal en mi código está accediendo a la sección .data. La sección .data es inicializada por el cargador copiando la sección .data del archivo elf a la memoria. – newguy

+0

Correcto, la sección de datos se carga en la memoria al igual que la sección de texto (pero en general es no ejecutable y el texto no es modificable, para tratar de evitar exploits). En el momento del enlace, se determina la ubicación en la que estará determinada palabra en la sección de datos y todas las instrucciones que lo hacen referencia (tendrán una reubicación con el nombre 'aglobal') se arreglan para apuntar a ese desplazamiento. Todo lo que el cargador necesita hacer es desplazar toda la imagen desde su dirección base a la dirección en la que realmente se carga en la memoria (muchas imágenes tienen una dirección base de 0, por lo que solo agrega la dirección de la memoria de inicio) –

+0

Gracias. Aprecio la ayuda Mike. – newguy