But you can place jump table (array of {JMP opcode, function address} structs) or vectors table (array of pointers) at fixed address. Also codewarrior has some support for ROM library, though I haven't tried it.
IMHO it's not a very good idea to do single project for both application code and bootloader code. Sharing code between application and bootloader can save some code space, but later you may have problems using different compiler switches, upgrading to more fresh compiler versions or changing compiler vendors. Possible calling conventions differences or something like that may break compatibility between application you just compiled and bootloader that is currently installed somewhere overseas. And then you will be forced to stop using shared bootloader functions and separate bootloader and application code.
Also, say bootloader uses some your own and some runtime routines from library, say A,B and C routines. Application uses routines B,C,D,E... Definitely bootloader should not erase routines ABC. But it is problematic to tell linker to force ABC to some dedicated segment. It is easy to #pragma and move functions defined in your code, but what about library functions and runtime routines? What is referenced by application part of your project files doesn't have to be placed in dedicated (not to be erased) segment, and what is called by bootloader part of your code has to be placed in dedicated segment... Is your solution to erase all the flash? But it is quite dangerous to do so. What if power fails after you emptied all the flash but before you finished flashing back bootloader part...
I prefer to 1) separate bootloader and application code, 2) secondary vectors table or jumptable to redirect vectors out of write protected bootloader flash. 3) For debugging purposes I concatenate bootloaders code with application code adding "HEXFILE boot.s19" line to application.prm.