I realized that I didn't want Level 9 (Common Block Subroutine Packing) optimizations performed on my code. Now, going back to Level 8 optimizations, I get IMPROPER FIXUP errors in my assembly startup code. What's the deal?
For those following this thread, the Keil Support Team came up with this answer: The problem you are seeing is due to the ACALLs in your startup code. The improper fixup is telling you that the label the ACALLs are referencing is not located in the same 2K page as the ACALLs themselves. There are 2 solutions to this problem: 1. USE LCALLs. 2. Change the declaration of the startup segment so that it starts at the beginning of a 2K boundary. Change the declaration for that segment to the following and your program will link with no errors: ?C_C51STARTUP SEGMENT CODE INBLOCK I assume that when Code Optimization Level 9 was being used, all my startup code happened to fit in the same 2K block, and when level 8 was used, some of my 'bloated' C code got injected in the startup space blowing it up to greater than 2K for the ACALL.