"A1": place at 0x08000000 { ro section .intvec };
"P1": place in [from 0x08000000 to 0x0801ffff] { ro };
"P2": place in [from 0x20000000 to 0x20013fff] { rw, block CSTACK, block HEAP };
"P3": place in [from 0x08020000 to 0x080fffff] { section .REWRITESTUFF };
в P1 лежит библиотека stdperiph и код для приема-передачи информации, остальное в P3, это и перезаписываю. После перезаписи тот же код падает на инициализации GPIO.

По ссылке картинка, на ней слева код после прошивки бутлоадером, справа - после программатора. Вызов функции одинаков, однако переходит в разные места. Также вызов GPIO_Init до ошибочного перехода выполняется несколько раз успешно. После ошибочного перехода выполняется с десяток строк и в hardfault.
Не понимаю куда копать, разница в одном щелчке мыши. После программатора идет куда надо, после бутлоадера сразу по неверному адресу. Видно, что перезаписано все правильно.