A essere precisi le librerie dinamiche sono solo quelle che si caricano eplicitamente con dlopen() / LoadLibrary. Il resto è tutto statico. Il fatto che siano in moduli diversi è solo per praticità/altro.
La printf() non è caricata dinamicamente, ma il relativo file lib, (o equivalente per Unix) è linkato in automatico dall'ide di sviluppo o scritto manualmente nel makefile relativo.
Dipende da come è stata linkata la CRT. Ora non ricordo le policy di uso del GCC, ma per il VC esiste la possibilità di incorporare nel codice la CRT, a prezzo di un eseguibile cicciotto, o lasciarla scorporata dal sorgente e usarla in forma di DLL. Nel primo caso l'eseguibile te lo porti dove vuoi, nel secondo la CRT in forma DLL te la devi portare dietro.se ad esempio sposto il programma dal computer nel quale ho compilato il programma, ad un altro computer con la stessa architettura, ma senza GCC installato (nel caso usi windows), il programma spostato sull' altro computer funziona o no?
Nota comunque che pure essendo in DLL, la CRT non è linkata dinamicamente, ma staticamente a causa del .lib usato nel makefile.