When we saw a similar problem, we also had some floating point code that seemed to be contributing. The code was doing a bunch of floating point calculations, and then casting the result back to a double. I think that generated a lot of compiler generated temporary floating point variables that filled up a .udata section.
We are still trying to figure out what went wrong, since it looks like there should have been enough room if the addressing went to another section, but it didn't (couldn't?).
Check out the mplink manual from Microchip. (Assembler/Linker/Librarian User's Guide).
http://ww1.microchip.com/downloads/e...Doc/33014J.pdf