Load a binary into flash memory using gdb

2

I'd like to flash a binary file into my ARM MCU flash memory using gdb.

Currently I'm able to load an elf like this:

# arm-none-eabi-gdb --command=flash.gdb "myfirmware.elf"

# cat flash.gdb
set confirm off
target remote 127.0.0.1:7224
monitor reset
load
detach
quit

Basically the load command is good at loading elf sections to the right addresses.

However to put multiple firmware in the MCU flash memory, I'd like to send a complete binary image. In order to test it, I made a zero.bin image (containing nothing but 0):

# hexdump zero.bin
0000000 0000 0000 0000 0000 0000 0000 0000 0000
*
0020000


# arm-none-eabi-gdb
(gdb) target remote 127.0.0.1:7224
(gdb) mon reset halt
(gdb) mon reset init
(gdb) set arm fallback-mode auto
(gdb) set debug arm
(gdb) restore zero.bin binary 0x0
Restoring binary file zero.bin into memory (0x0 to 0x20000)
Writing to flash memory forbidden in this context
(gdb) info mem                                                                                                         
Using memory regions provided by the target.                                                              
Num Enb Low Addr   High Addr  Attrs                                                                      
0   y   0x00000000 0x00020000 flash blocksize 0x800 nocache                                              
1   y   0x00020000 0x100000000 rw nocache        
(gdb) delete mem 1
warning: Switching to manual control of memory regions; use "mem auto" to fetch regions from the target again.
(gdb) delete mem 0
(gdb) mem 0 0x100000000 rw nocache
(gdb) info mem
Using user-defined memory regions.
Num Enb Low Addr   High Addr  Attrs
1   y   0x00000000 0x100000000 rw nocache
(gdb) restore zero.bin binary 0x0
Restoring binary file zero.bin into memory (0x0 to 0x20000)
(gdb) x/10 0x0
0x0:    0x20003000      0x00003c5d      0x00003c7d      0x00003c7d
0x10:   0x00000000      0x00000000      0x00000000      0x00000000
0x20:   0x00000000      0x00000000

So this doesn't seem to work, as you can see in 0x0 it should be full of '0' but it still contains my previous firmware (the vector table actually)

What do I miss? Or maybe there is another way to load a binary using gdb?

arm
gdb
asked on Stack Overflow Sep 5, 2017 by Ervadac

2 Answers

0

If you are using OpenOCD,

mon flash write_bank <num> <file_name> <offset>

should help you.

For example, if your flash starts at 0x400000,

mon flash write_bank 0 zero.bin 0x100000

will write the zero.bin file at 0x500000, assuming that address is writable.

answered on Stack Overflow Dec 21, 2017 by Yash Jakhotiya
0

You can't delete memory region. Because GDB uses vFlashWrite packet for writing to flash memory and M or X packets for writing to RAM.

I know only one way to write binary data to flash memory using gdb. You need to transform your binary image to elf-file with one single .data section.

powerpc-objcopy -I binary -O elf32-powerpc -B PowerPC -S zero.bin zero.elf

For checking your new elf-file use readelf.

powerpc-readelf -h -t zero.elf

In the end just use load command with flash base address, because this elf-file has not any address information. (or you can use --change-addresses 0x0 option with objcopy)

load zero.elf 0x0

I checked this on PowerPC. GDB version is 8.1.

This GDB was configured as "--host=x86_64-pc-linux-gnu --target=powerpc-eabi".

answered on Stack Overflow Mar 26, 2018 by snleontyev • edited Mar 27, 2018 by snleontyev

User contributions licensed under CC BY-SA 3.0