main() 함수 없이 C 프로그램을 작성하는 것이 가능할까요? 정답은 가능하다입니다. 이 글에서는 main() 함수가 전혀 없는 상태로 실행되는 C 프로그램을 만드는 방법을 살펴보겠습니다.
일반적으로 main() 함수는 프로그램 실행의 시작점(entry point)이라고 알려져 있습니다. 하지만 이것은 어디까지나 프로그래머의 관점에서만 사실입니다. 시스템의 관점에서 보면 이야기가 다릅니다.
프로그램의 실제 시작점: _start()
실제로 운영체제는 프로그램을 실행할 때 가장 먼저 _start() 함수를 호출합니다. 이 함수는 프로그램 실행에 필요한 환경(스택 초기화, 명령줄 인자 및 환경 변수 설정 등)을 준비한 후, 그다음에 main() 함수를 호출하는 역할을 합니다.
즉, main()은 _start()가 호출하는 하나의 콜백 함수에 불과하며, 우리가 직접 _start()를 구현하면 main() 없이도 프로그램을 실행할 수 있습니다.
예제 코드
#include <stdio.h>
extern void _exit(register int);
int _start() {
printf("Program without main\n");
_exit(0);
}위 코드에서는 표준 진입점인 _start()를 직접 정의했습니다. 프로그램 종료 시에는 반드시 _exit()를 호출해야 하며, 일반적인 exit() 대신 시스템 레벨의 _exit()를 사용하는 것이 안전합니다.
컴파일 및 실행 방법
이 프로그램을 컴파일할 때는 -nostartfiles 옵션을 사용해야 합니다. 이 옵션은 GCC가 기본적으로 링크하는 표준 시작 파일(crt0 등)을 제외하라는 의미로, 그래야 우리가 정의한 _start()가 진입점으로 인식됩니다.
soumyadeep@soumyadeep-VirtualBox:~/Cpp_progs$ gcc test_prog.c -nostartfiles soumyadeep@soumyadeep-VirtualBox:~/Cpp_progs$ ./a.out Program without main soumyadeep@soumyadeep-VirtualBox:~/Cpp_progs$
정리
- main()은 프로그래머 관점의 시작점이며, 시스템 관점의 실제 진입점은
_start()입니다. _start()를 직접 구현하면 main() 없이 프로그램을 실행할 수 있습니다.- 컴파일 시
-nostartfiles옵션을 지정해 기본 시작 파일의 링크를 생략해야 합니다. - 프로그램 종료 시에는
_exit()를 사용하여 프로세스를 종료합니다.