I think I have this straightened out now.
The fact that the program stopped working after a hard reset was an indicator that my DATA segment wasn't being handled appropriately. The part of the startup code that was copying my DATA segment from Flash to RAM had a few issues. I ended up splitting my DATA and BSS segments up into protected and non-protected segments. This required me to re-write parts of the start-up code.
Like I said before, this is my first bootloader. I'd be interested in reading or discussing pros/cons to various strategies.
My bootloader needs SPI, UART, driver for LCD display, driver for External Flash, etc, etc... So, instead of duplicating code, I decided to share this common code between application and bootloader. This also allowed me to use a single project for application and bootloader. Normally, I see this split-up as two separate projects which seemed like a headache to me. I feel my solution is safe, but a bit on the complicated side.