1. Regarding position independence. If you would need just a single image, then you could compile it for known absolute addresses. Also, if you know which image is to sit in low addresses and which in high addresses, then you can compile those images for known absolute destination addresses. But if you need any image to work from both locations, either low or high, then you need to compile it with position independent code option. Constant data in flash should be code relative. RAM data should be fixed addresses, not code relative,
Regarding vector tables. Vectors table entries are pointers to absolute locations. So if you use position independent images, then you should adjust your images vector table in RAM to point to valid locations.
2. It would be nice if you could make your images replacing bootloader image just writing to FLASHBAR. FLASHBAR granularity is 512k and that way more than flash size.
I did a bootloader for MCF51QE128. It's not a 5212 but also coldfire :smileyhappy:. Yes, bootloader starts first and checks two conditions: 1) bootloader checks if image is loaded (the first longword of image isn't erased flash ==0xffffffff, also it could be some image checksum validation), 2) bootloader checks some more conditions (is button on the demoboard pressed, signaling I don't want to pass control to misbehaving image but load another one).
I compile my single image as absolute, but with code and vector table shifted up in memory by size of bootloader. Bootloader knows the address of images vector table and
MOVE.L (APP_START),D2 ; load images 0th vector, initial SP
; of the image
CMP.L #0xFFFFFFFF,D2 ; is it erased flash?
BEQ.B continue_with_bootloader
MOVEA.L D2,SP ; image isn't erased, init images SP
MOVE.L (APP_START+4), A0 ; --jump to address pointed by 1st vector
JMP (A0) ; /
continue_with_bootloader
BTW it would be nice to preserve D0 and D1 registers until image starts. D0 and D1 after reset contain about coldfire version and about availability of mac, hw divider etc.
After I jump to the image, image copies its vector table to bottom of RAM, then image initializes VBR register to use vector table in RAM. Using position independent image you would need also to adjust vector table entries depending on absolute image position.