Sí: tienes que reubicar tu tabla vectorial, de lo contrario, las interrupciones dispararán a los manejadores del gestor de arranque, lo que casi con certeza provocará un bloqueo.
Primero, modifica la secuencia de comandos del vinculador para "mover el flash" un poco más alto (por ejemplo, 0x8000 en su caso), esto también significará que la nueva tabla de vectores comienza en 0x8000, a menos que lo elimine todo junto y lo coloque en la RAM, pero ese es un tema ligeramente diferente (recuerde el requisito de alineación de 256 bytes para el NVIC en ese caso).
Normalmente utilizo un código como este para saltar a la aplicación:
#define APPLICATION_BASE 0x8000
__attribute__((noreturn)) static void start_application(void){
SCB->VTOR = APPLICATION_BASE; //move interrupt vector base
typedef void (*function_void_t)(void);
#define avuint32(avar) (*((volatile uint32_t *) (avar)))
function_void_t application;
application = (function_void_t)(avuint32(APPLICATION_BASE+4));
__DSB();
application();
__builtin_unreachable();
}
El "salto" se desplaza en 4 porque la primera palabra en el blob es el puntero de pila inicial, la segunda palabra es el vector de restablecimiento de la aplicación. Este código hará que la aplicación use la pila del gestor de arranque, por lo que es posible que tenga que modificarla un poco (algunos bytes de la pila se perderán porque fueron utilizados por el gestor de arranque).