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 |