crt0

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”

위 내용은 현재까지 확인된 기술 문서와 공개된 소스 코드 정보를 기반으로 작성되었으며, 추가적인 비공식적 변형이나 특수 환경에 대한 상세 내용은 포함되지 않을 수 있다.

둘러보기

더 찾아볼 만한 주제