Volcar la memoria completa del programa de metal desnudo del archivo gdb.
Tengo un programa simple en C de la siguiente manera:
int a = 10;
int b = 20;
int sum = 0;
void add() { sum = a + b; }
int main() {
add();
return 0;
}
Compile esto para risc-v con el siguiente comando y especifique que el segmento .text
debe comenzar en 0x1000
.
riscv32-unknown-elf-gcc -static -T elf32lriscv.x -Wl,-Ttext-segment=0x1000 -Wl,-Map=add.elf.map -o add.elf add.c
Si imprimo la información del archivo usando gdb, veo lo siguiente:
(gdb) i files
Symbols from "/home/mango/myp/risc-v/prog/add.elf".
Local exec file:
`/home/mango/myp/risc-v/prog/add.elf', tipo de archivo elf32-littleriscv.
Punto de entrada: 0x108c
0x00001074 - 0x0000159c es .text
0x0000259c - 0x000025a0 es .eh_frame
0x000025a0 - 0x000025a8 es .init_array
0x000025a8 - 0x000025ac es .fini_array
0x000025b0 - 0x000029d8 es .data
0x000029d8 - 0x000029ec es .sdata
0x000029ec - 0x000029f0 es .sbss
0x000029f0 - 0x00002a0c es .bss
¿Existe una forma sencilla de volcar la memoria desde 0x1074
hasta 0x2a0c
?
El comando dump memory
necesita una dirección de inicio y fin, pero como esto cambia según el programa, preferiría poder volcar este valor automáticamente. Además, esto es claramente accesible dentro de gdb, ¿hay alguna forma de obtener esto automáticamente?
Mi objetivo final es crear un archivo de comandos para gdb y pasar eso de la siguiente manera para automatizar el volcado de memoria:
bash
gdb --command=gdb_commands <nombre_archivo>
davy.ai
Sí, hay una manera sencilla de volcar la memoria desde
0x1074
hasta0x2a0c
. Puedes usar el comandoinfo files
en gdb para obtener las direcciones de inicio y fin de las secciones.text
y.bss
, y luego utilizarlas para especificar el rango en el comandodump memory
.Aquí tienes un archivo de comandos de ejemplo para gdb (
gdb_commands
) que volcará la memoria desde0x1074
hasta0x2a0c
:El comando
info files
mostrará las direcciones de inicio y fin de las secciones.text
y.bss
, junto con otras secciones del archivo. Puedes utilizar estas direcciones para especificar el rango en el comandodump memory
.Guarda este archivo como
gdb_commands
y luego ejecuta el siguiente comando para automatizar el proceso:Esto ejecutará gdb, ejecutará los comandos en
gdb_commands
y luego se cerrará. El volcado de memoria se guardará endump.bin
.Ten en cuenta que es posible que debas modificar las direcciones en el comando
dump memory
en función de la salida deinfo files
, ya que pueden ser diferentes para tu programa específico.