O kernel e o tempo de execução C fazem parte do trabalho.
Algumas das coisas que o tempo de execução de C faz que o kernel não faz: ele executa manipuladores previamente registrados com atexit() e ele organiza para que o valor de retorno inteiro de main() seja retornado ao sistema como se fosse exit() .
É claro que, no final, o kernel colherá todos os recursos (arquivos, memória), independentemente do que o usuário faça ou não faça.