Оказывается, main ничем от других функций не отличается (помимо того, что является точкой входа в программу). Приведённый ниже код компилируется с самыми "жёсткими" флагами и успешно работает (печатает переданные аргументы).
#include <stdio.h>
int main(int argc, char *argv[]) {
if (argc > 1) {
printf("%s\n", argv[1]);
main(argc - 1, argv + 1);
}
return 0;
}