Обычно программа стартует не с main(), а со startup-кода, который инициализирует переменные в ОЗУ, стеки, и только потом вызывает main(), как функцию. При желании cstartup.* можно модифицировать (он обычно на ассемблере написан, но простенько), чтобы использовать возврат от main().