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í?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top