Vector table relocation in bootloader application
Yes - you have to relocate your vector table, otherwise the interrupts will fire handlers of the bootloader, which will almost certainly lead to a crash.

First you modify the linker script to "move the flash" a little bit higher (eg. 0x8000 in your case), this will also mean that the new vector table starts at 0x8000, unless you remove it all together and place it in RAM - but that is a slightly different topic (remember about the 256-byte alignment requirement for the NVIC in that case).

I usually use a piece of code like this to jump to the application:

#define APPLICATION_BASE 0x8000
__attribute__((noreturn)) static void start_application(void){

    SCB-&gt;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();
}


The "jump" is offset by 4 because the first word in the blob is the initial stack pointer, the second word is the reset vector of the application. This code will make the application use the stack of the bootloader, so you may have to tweak it a little (some bytes of the stack will be lost because they were used by the bootloader).