>> This is also what I am suggesting further below in the post.
> But all your post was only about negative aspects of copy-down...
This is what I wrote "further below":
"- Write your own vector table in C, unless you have done this already. It is possible to do so with pure ISO C, I have posted an example of how to do so in CW somewhere on these boards.
- In your own reset vector, set the stack, watchdog, and other such fundamental stuff. Then call main from there."
> "The Best solution" isn't the best at all, because there are similar chances of either 1) someone taking your old project will enable "get rid of static initialization" or 2) someone taking your old project will modify it expecting standard zeroout. If case 1 doesn't know what he is doing, then case 2 is expecting standard C behaviour. What's better?
This is why you should write your code so that it isn't dependent on static initalization. If nobody relies on it, neither me or the person getting their hands on my code, then there will never be any problems, no matter compiler settings.
> Standard defined headers math.h, stdio.h etc no doubt must be pure C.
There was a time when I believed so too, before I got too much nerdy in-depth knowledge of the C standard... Out of curiousity, I did just now investigate CW math.h (plus included headers from math.h) regarding compliance.
3 different violations of the C90 standard were found at brief examination:
1) #endif __NO_MATH_PROTOTYPES__
2) #define NEAR near
3) #define FAR far
None of these standard violations fills any purpose at all.
> But @ extension allowing real variables to be placed at const addresses eases debugging.
This is just there because some muppet decided: "Hey, I want to make my own operator! Now wouldn't that be nice?". This could have been resolved with #pragmas instead and there wouldn't be any standard violations.
(Or better: a target aware debugger. Ooh that would be so nice, such a debugger wouldn't munch up my SPI and SCI status registers either. Can I have one for christmas, Freescale?)
> Maybe big C struct for whole registers block could be defined and placed at start of regs block, I don't know.
This is entirely possible to do in CW, but only if you get rid of static initalization!
Because otherwise the compiler will download copy-down zeroes into your registers, which might be a tad bit unconvenient. Yay, another reason to get rid of the startup file! 
> Typical debug session starts with haywire: nothing is initialized, CPU is halted forever.
What if something goes haywire in the real product then?
> Don't you debug your code on real hardware or do you have working sensible solution?
I don't touch software simulators, I always debug on hardware. Whatever that has to do with anything... The sensible solution would be the initialization of registers directly from the reset vector as suggested elsewhere.
> You are right here and that's weird. I guess linker forces usage of _Startup to draw call tree in the map file. What for linker needs _startupData I don't know. I even tried to suppress map file generation putting MAPFILE NONE to PRM file. It didn't help.
I have been playing around with this too in the past, without a solution. So instead I have a merry little _startupData in dead flash space in all my products, that is never called. I guess it will at least confuse the heck out of the reverse engineers.