How does your bootloader checks that there is a valid application to launch? I presume it reads a few words at specific addresses (usually at the very beginning of the application) to check that it looks like a valid application (starting e.g. with a known code sequence or a valid vector table) or even compute a CRC to check th ecode was not corruted.
That means that your application binary file layout may depend on the toolchain used (especially on the startup code provided by the toolchain) so you may have to adapt your bootloader or “mimic” the Keil-generated header so that the bootloader “thinks” it was generated by the Keil toolchain.
Hope this helps,