ELF formato de archivo
-
29-09-2019 - |
Pregunta
Estoy intentando cargar manualmente el hexdump de un archivo de Elf que compila utilizando g ++ en una simulación procesador he diseñado. Hay 30 secciones en un archivo elf estándar y yo estoy cargando los 30 segmentos con su ubicación en la memoria desfase apropiado tenido en cuenta. entonces comienzo mi contador de programa al comienzo de la sección .text
(00400130), pero parece que el programa no está funcionando correctamente. He verificado mi diseño del procesador relativamente bien utilizando SPIM como estándar de oro. Lo extraño es que, si me carga un archivo de ensamblaje en SPIM, y luego tomar las secciones .text
y .data
desmontadas que son generados por el software, cargarlos en la memoria de mi procesador, los programas de trabajo. Esto es diferente de lo que yo quiero hacer porque quiero:
- escribir un programa en C ++
- compilar usando mipseb-linux-g ++ (compilador cruzado)
- volcado hexadecimal todas las secciones en su propio archivo
- archivos y contenidos de carga en el procesador "memoria" leer
- programa ejecute
Cuando en el archivo ELF debo colocar mi programa contador inicialmente? Tengo que al comienzo de .text
en este momento. Además, no sólo tengo que incluir .text
y .data
para mi programa para que funcione correctamente? ¿Qué estoy haciendo mal aquí?
Solución
La cabecera ELF debe incluir la dirección de entrada, que no es necesariamente la misma que la primera dirección en la región .text
. Uso objdump -f
para ver cuál es el punto de entrada del fichero es -. Que va a ser llamada la "dirección de inicio"
El formato se describe aquí - usted debe utilizar el program headers
vez que el section headers
para cargar la imagen ELF en la memoria (I duda de que hay 30 encabezados de programa), y el punto de entrada se describirá por el campo e_entry
en la cabecera de ELF.
Otros consejos
Utilice el campo e_entry de la cabecera ELF para determinar dónde establecer el contador de programa.
Mira en Elf32_Ehdr.e_entry
(o Elf64_Ehdr.e_entry
si está en la plataforma de 64 bits). Al menos debe también incluir la sección .bss
, que está vacía, pero tiene "en memoria" tamaño de la imagen del disco en ELF.
Wikipedia le llevará a todos los necesaria documentación .
Editar:
Aquí está de objdump -h /usr/bin/vim
en mi caja actual:
Sections:
Idx Name Size VMA LMA File off Algn
...
22 .bss 00009628 00000000006df760 00000000006df760 001df760 2**5
ALLOC
23 .comment 00000bc8 0000000000000000 0000000000000000 001df760 2**0
CONTENTS, READONLY
Tenga en cuenta la File off
es el mismo para ambos .bss
y .comment
, lo que significa .bss
está vacía en el archivo de disco, sino que debe ser 0x9628
bytes de memoria.