The __chkstk stuff I see is in VS2008, C++ code, where it's needed to hit the stack pages which need to be allocated. I remember understanding this stuff once, but I've forgotten the details...
There are a number of other artifacts you need for VS2008 C++, which I am happy to share details about. I also have a party complete tiny C runtime library which I am more than happy to post here, it uses Windows API for file and memory handling, and little custom routines for many other useful things.
With crinkler I am able to get my DBF competition demos which were 60 or 70Kb down to 10-12Kb, even though I didn't write them with size coding in mind at all - no optimisation. The only thing missing is the static initialisers. That's just because crinkler doesn't order/merge segments the same way as Microsoft's linker. It's not a big problem since I can initialise the thing manually, I was just trying to automate it all

The problem is .CRT$XIA is supposed to come before .CRT$XIZ and any initializers are meant to be alphabetically ordered, segment name-wise, in between them, so my one ends up in .CRT$XIU.
With kkrunkchy I can only get to 25Kb.
crt.zip attached - it's very green and sloppy, I hardly expect any of it to work right, but it's enough to support 6 out of 10 of my demos. Cut and paste what you need. The atof and float to string have come from the web - if you use them you need to credit.
Jim