TIL/2026

Main 보다 먼저 호출되는 코드가 있다?!

고무 오리 2026. 1. 21. 18:05
728x90

C언어의 시작은 main()이 국룰? 아니다. 이 속성을 쓰면 main() 진입 전에 코드가 실행된다.

 

Constructor Attribute

gcc, clang 컴파일러가 제공하는 확장 속성

__attribute__((constructor)) 가 명시된 함수들을 main() 진입 직전에 자동으로 실행

__attribute__((constructor)) 
void pre_main() { 
    // Main보다 먼저 실행됨
}

 

여러 파일에 여러 개 정의되어 있어도 모두 main() 진입 직전 실행 됨

 

왜 쓰나?

모듈(Module)과 라이브러리가  "자율적 초기화(Self-Initialization)" 를 수행 할 수 있음

main 함수가 모든 모듈의 초기화 코드를 알 필요가 없게 만들어, 의존성(Dependency) 제거 할 수 있음

 

동작은?

Compiler: 해당 함수들의 주소를 특수 섹션(.init_array)에 수집

Loader: 프로그램 실행 시, 이 목록을 순회하며 실행 한 뒤 main 으로 진입

 

Real world

오픈소스 거장들은 이 기능을 구조적 우아함 을 위해 사용

 

QEMU (에뮬레이터): 자동 등록

  • Driver: 수많은 디스크 드라이버 파일들이 컴파일과 동시에 시스템에 자신을 등록 합니다. 개발자가 main 에 드라이버 목록을 적을 필요가 없습니다.

Jemalloc (메모리 할당자): 투명한 준비

  • Allocator: 라이브러리가 로드되자마자 메모리 풀(Pool)을 구성 합니다. 사용자는 별도의 init 호출 없이 바로 malloc 을 사용할 수 있습니다.

 

destruct는 없나?

있음!

main()이 정상 종료 될 때 __attribute__((destructor)) 가 호출 됨

동작 및 사용 이유는 동일!

 

결론

복잡한 초기화 로직, main에 구겨 넣지 말고 모듈에게 위임(Delegate) 하라. 코드가 훨씬 깔끔해진다!

728x90

'TIL > 2026' 카테고리의 다른 글

find, grep 그리고 xargs 완벽 구분  (0) 2026.02.12
UEFI 무엇인가  (0) 2026.02.12
Suspend to RAM  (0) 2026.02.12
muldiv64 는 무엇인가?  (0) 2026.01.21
VectorCAST : clicast vs DATA API (manage)  (0) 2026.01.07