C-related runtime is a wrapper around your "core" function; it initializes everything that is needed before your C code can be run. It does not contain (m) any "functions" that are in the standard C library (which is dynamically linked).
I think you misunderstand dynamic binding: this is done by the OS. This way you tell the OS that your executable needs DLLs a , b , c and d . When you execute an executable file, the OS will load the executable file in a memory location and read in the executable file what is needed to run it. Then it will capture these DLLs and insert them into the memory area of your executable file, and then it tells your code that a loaded into x , b loaded from y , etc. Therefore, your code may call it functions.
Sometimes compilers include a (called static binding) library at compile time: they do this so that the OS does not load it at run time and therefore loads faster.
.lib files are DLL files without a "D" because they can be statically linked. It is also possible to dynamically link library files; this makes your executable file smaller, but makes the loading time of your executable file slower.
About WinAPI: most C library calls are converted to (some) calls in WinAPI; but only if they must interact with the OS (I / O, etc.). The difference is that the C library is the same on most platforms, so it improves portability if you use the C library directly instead of the Windows API.
Update:
You asked how to load a DLL if you are linking your executable file dynamically? Well: you don’t have to! The difference between "load dll" and "call to load dll" is; "load dll" is executed by the OS when the application starts. The OS will search for your executable file for the specific "import table". This is the table in which the DLL is valid before it can execute (i.e. kernel32.dll or user32.dll on Windows). The OS will make a “call to download dll”, even before your code runs.
A “call to download dll” also exists in kernel32.dll for your code that is being called: it can load / unload DLLs at the time your code runs. This may be the case if you have a huge code base and you want to free up memory by unloading this one-time library throughout the entire application life cycle (for example, during startup). If you no longer use this function, you can unload the DLL. But it is also possible that you need some function that you have not yet downloaded to speed up the download. You can then load the DLL if you need the function yourself. This is quite advanced material, and most of the time, the OS replaces unused DLLs (“deleting” memory literally: it moves memory that is not used much (for example, an unused DLL) to the place of mass storage, like a hard disk. If you need it necessary, it will automatically “swap” back!).
So: you don’t have to worry much about loading / unloading DLLs in Windows. If you have a good linker and tell it to dynamically link to libraries, everything will work fine.