3) Make a hardware bootstrapper which can hold the CPU in reset, load the
CPU RAM from an external source and release the reset line.
This may at least get you thinking on what is appropriate for your
platform.
It goes the same as for all other platforms.
I use gdb to load an application into RAM, or load the application into flash,
which then copies .data to RAM and executes itself from RAM/flash.
See linker (.ld) scripts in e.g. or1ksim/testbench for latter loaders. First
one is trivial anyway.
At the end, in an embedded application there is no gdb :-).