crt0
crt0는 Unix 계열 운영체제와 그 파생 시스템에서 C 언어 프로그램을 실행할 때 사용되는 초기화 코드를 포함하는 객체 파일 또는 소스 파일을 의미한다. 일반적으로 crt0.o(또는 crt0.c)라는 이름으로 제공되며, 프로그램이 시작될 때 가장 먼저 실행되는 코드를 제공한다.
개요
- 역할: 프로그램 시작점인
_start심볼을 정의하고, 실행 환경(스택, 인자, 환경 변수 등)을 설정한 뒤, 표준 C 라이브러리 초기화 함수(__libc_start_main등)를 호출하여 사용자가 정의한main함수로 제어를 넘긴다.main함수가 반환되면 정리 작업을 수행하고 프로세스를 종료한다. - 링크 과정: GCC·Clang 등 C 컴파일러는 기본적으로 링커 옵션에
crt0.o를 포함한다. 따라서 사용자가 별도로 지정하지 않아도 자동으로 연결된다. - 구성 요소:
_start엔트리 포인트- 스택 포인터 및 인자(
argc,argv,envp) 설정 - 전역 초기화(
.init섹션)와 전역 소멸(.fini섹션) 호출 __libc_start_main(glibc) 또는 해당 C 런타임 라이브러리의 초기화 루틴 호출
역사·유래
- 어원: “C Runtime”의 약자에서 “crt”와 “0”(제로, 초기 단계)을 결합한 형태로, 초기화 코드가 가장 첫 번째 단계임을 나타낸다.
- 역사: 1970~1980년대 초기 Unix 시스템에서 C 컴파일러와 함께 제공되었으며, 이후 BSD, Linux, macOS 등 다양한 Unix‑like 시스템에서 표준 구성 요소로 자리 잡았다. GNU C 라이브러리(glibc)와 같은 현대적 런타임에서도 여전히
crt0계열 파일이 사용된다.
플랫폼별 구현 차이
| 플랫폼 | 주요 파일 | 특징 |
|---|---|---|
| Linux (glibc) | crt0.c, crt1.o |
__libc_start_main을 호출해 main을 실행 |
| BSD | crt0.o |
시스템 콜 인터페이스에 따라 약간 다른 초기화 순서 |
| macOS | crt0.o(Mach-O) |
Mach 커널에 맞춘 초기화 로직 포함 |
| 임베디드 (bare‑metal) | crt0.S(어셈블리) |
하드웨어 초기화와 부트 로더 연동을 포함 |
관련 파일·개념
crt1.o/crti.o/crtn.o:crt0와 함께 사용되는 추가 초기화/정리 섹션 객체 파일__libc_start_main: glibc에서main호출 전후의 표준 초기화·정리 작업을 담당- 링커 스크립트:
crt0가 삽입되는 위치를 지정
참고 문헌·자료
- GNU C Library Manual – “Program Startup”
- Linux Man 페이지
crt0(5)(일부 배포판에 존재) - BSD Manual – “crt0”
위 내용은 현재까지 확인된 기술 문서와 공개된 소스 코드 정보를 기반으로 작성되었으며, 추가적인 비공식적 변형이나 특수 환경에 대한 상세 내용은 포함되지 않을 수 있다.