피드로 돌아가기
GeekNewsInfrastructure
원문 읽기
Rust에서 main 이전에도 실행되는 코드가 있다
Linker Section 기반 pre-main 초기화로 Lock-free 전역 상태 구성
AI 요약
Context
Rust 바이너리는 fn main() 진입 전 C 및 Rust 런타임 초기화 단계를 거침. 기존의 정적 초기화 호출 트리는 런타임 복잡도 증가에 따라 Dead Code 제거가 어렵고 바이너리 크기를 비대하게 만드는 한계점이 존재함.
Technical Solution
- Linker Section을 활용하여 여러 크레이트의 데이터를 바이너리 작성 시점에 특정 영역으로 집계하는 구조 설계
- #[unsafe(link_section = "...")] 속성을 통해 함수 포인터나 데이터를 .init_array 등 특정 섹션에 배치하여 런타임 전 자동 등록 구현
- ctor 크레이트를 통한 플랫폼별 런타임 진입점 추상화 및 생성자 우선순위 제어 로직 적용
- pre-main 단계의 단일 스레드 특성을 이용하여 Mutex 없이 UnsafeCell 기반의 가변 데이터 초기화 수행
- 링커 심볼(_start, _stop)을 활용해 섹션의 경계 주소를 확보하고 이를 Rust 슬라이스로 변환하여 런타임에 접근
- 문자열 인터닝 풀 정렬 및 CLI 서브커맨드 등록과 같이 읽기 전용 데이터가 필요한 패턴에 제어 역전(IoC) 적용
실천 포인트
- 전역 상태 초기화 시 런타임 오버헤드를 줄이기 위해 Linker Section 기반의 자동 등록 패턴 검토 - main 이전 단일 스레드 환경을 활용한 Lock-free 데이터 구성 가능성 확인 - 플랫폼별 링커 섹션 명칭 차이(ELF vs PE vs Mach-O)에 따른 추상화 계층 적용 여부 판단 - UnsafeCell 사용 시 LLVM의 최적화로 인한 값 캐싱 방지를 위해 메모리 모델 준수 여부 점검