Separate CRT into a number of sub-libraries (preferably object libraries object libraries don't work, because they get directly linked into the module)
crt_compilersupport: contains _chkstk, __allmull etc., and all compiler/architecture dependent support routines linked to all modules by default
crt_common (potentially devided into crt_math, crt_stdio, crt_stdlib, etc), which are binary identical in CRT/LIBCNTPR
crt_printf (basic routines in one lib, separate libs for individually compiled streamout/wstreamout for msvcrt, ntdll, user32, crtdll)
crt (links all common stuff plus individual stuff)
libcntpr (see above)
msvcrtex links startup code + crt_compilersupport
cleanup duplicates (like malloc and friends)
stop linking ntdll to most modules, use crt_compilersupport instead
optional: make ntdll crt exports private and create an additional ntdll_crt importlib (generate_importlib()) to explicitly select these in native apps, so that msvcrt can no longer accidentally use these
fix crtdll to use the correct printf functions, don't import the generic CRT and don't reinitialize tls etc., instead forward to msvcrt (need to check usage of globals, also: do we need to explicitly import from msvcrt?)
We might need to generally use full versions of all functions that use globabs, to allow the dll to have a custom state, when 2 different CRT libs are loaded (applies to crtdll.dll/msvcrt*.dll, not to version specific versions of msvcrt.dll)