피드로 돌아가기
LLVM #6 — Compiling to Object Code.
Dev.toDev.to
Infrastructure

JIT 기반 메모리 실행을 넘어 Object Code 기반의 정적 링크 구조 설계

LLVM #6 — Compiling to Object Code.

Lahari Tenneti2026년 6월 8일5advanced

Context

기존 JIT 컴파일러는 IR을 머신 코드로 변환하여 RAM에서 즉시 실행하는 구조로, 프로세스 종료 시 생성된 코드가 모두 소멸하는 일회성 한계 존재. 지속 가능한 코드 배포와 외부 C++ 프로그램과의 연동을 위해 디스크에 .o 파일을 생성하는 Object Code 출력 구조로의 전환 필요.

Technical Solution

  • Target Triple 설정을 통한 하드웨어 아키텍처, 벤더, OS, ABI 정보를 정의하여 Cross-compilation 기반 마련
  • InitializeAllTargetInfos 등 5단계 서브시스템 초기화를 통해 하드웨어 플랫폼 정보부터 Machine-code 추상화 레이어까지 전체 백엔드 활성화
  • Target Machine 설정을 통한 데이터 레이아웃 및 메모리 정렬 규칙 정의로 Optimizer에 타겟별 포인터 크기 정보 제공
  • legacy::PassManager를 활용하여 Module 내 IR을 실제 바이트 단위의 Object File로 변환하는 정적 코드 생성 파이프라인 구축
  • JIT 이동 전 HandleDefinition 단계에서 Emitting을 수행하여 Module 내 함수 정의가 소멸하기 전 디스크에 기록하는 생명주기 제어
  • macOS의 Symbol Prefix 규격(_ prefix)을 반영한 asm label 설정을 통해 Linker의 Symbol Mismatch 문제 해결

1. Cross-compilation 설계 시 Target Triple의 ABI 규격이 대상 OS와 일치하는지 확인

2. 컴파일러 파이프라인 설계 시 IR의 생명주기와 JIT 메모리 전이 시점을 분석하여 Emitting 타이밍 결정

3. 서로 다른 언어/컴파일러 간 Linking 시 플랫폼별 Symbol Naming Convention(예: macOS의 언더바 접두사) 검토

원문 읽기