---
title: "live-bootstrap의 stage0를 단순화하는 C 컴파일러 프로젝트"
published: 2025-12-17T23:34:51.000Z
canonical: https://jeff.news/article/970
---
# live-bootstrap의 stage0를 단순화하는 C 컴파일러 프로젝트

GNU Mes를 대체하는 C 컴파일러를 C로 작성해서 TCC를 컴파일하는 프로젝트. Stack-C 중간 언어를 거쳐 감사 가능한 빌드 체인을 구축하며, 이미 TCC 0.9.27 빌드에 성공해 live-bootstrap 결과물과 SHA256 해시가 일치함.

## 프로젝트 목표

- live-bootstrap의 stage0를 단순화하려는 프로젝트임. 구체적으로는 GNU Mes 컴파일러를 대체하는 C 컴파일러를 C로 작성해서 Tiny C Compiler(TCC) 0.9.26을 컴파일하는 것이 목표
- live-bootstrap이 뭐냐면, 소스코드에서 완전히 재현 가능한(reproducible) 빌드 체인을 구축하는 프로젝트인데, 여기서 가장 초기 단계(stage0)가 제일 복잡함. 이걸 단순화하겠다는 시도

## 구현 구조

- 핵심 소스는 `tcc_cc.c` — i386용 C 컴파일러로, **Stack-C**라는 스택 기반 중간 언어(Intermediate Language)를 생성함
- 이 중간 코드를 `stack_c.c`로 M1 어셈블리로 컴파일하거나, `stack_c_interpreter.c`로 인터프리팅할 수 있음
- `stdlib.c`에 최소한의 C 표준 라이브러리도 포함되어 있음
- 검증 방법이 꽤 재밌는데, hex0 파일에 3단 컬럼 포맷으로 16진수 ↔ 어셈블리 명령어 ↔ Stack-C 중간 코드 ↔ 원본 C 소스 라인 번호를 다 매핑해둠. 수작업 감사(audit)가 가능하도록 한 거

## 현재 진행 상황

- **Task 1** 완료: chroot 환경에서 TCC를 빌드하고, `tcc-boot1`과 `tcc-boot2`가 live-bootstrap 결과물과 동일한 SHA256 해시를 가지는 것을 확인함. `tcc-boot0`만 다른데, 이건 GNU Mes가 64비트 정수를 지원하는 반면 `tcc_cc`는 아직 미지원이기 때문
- **Task 2** 진행 중: stage0 실행파일들의 외부 의존성을 제거하고 전부 이 C 컴파일러로 빌드하는 작업. `blood-elf`, `kaem`, `sha256sum`, `ungz`, `untar` 등 15개 이상의 유틸리티를 이미 성공적으로 컴파일함
- **Task 3** 완료: kaem 스크립트로 TCC 0.9.27 빌드 성공. live-bootstrap 프로젝트의 결과물과 동일한 SHA256 해시 확인

## 향후 계획

- x86 외에 **x86_64, ARM, RISC-V64** 타겟으로 Stack-C 변환기를 작성할 예정. x86_64는 비교적 단순하지만 나머지는 QEMU 같은 에뮬레이션 환경에서 테스트가 필요한 상황
- TCC 컴파일에 필요한 C 문법 부분 집합을 분석하기 위해 최소 C 전처리기(`min_tcc_preprocessor.cpp`)와 파서(`CParser.c`)도 개발함

## 핵심 포인트

- C로 작성한 컴파일러가 Stack-C 중간 언어를 생성하고 M1 어셈블리로 변환
- TCC 0.9.27 빌드 성공 — live-bootstrap 결과물과 SHA256 해시 일치 확인
- hex0 파일에 C소스 라인↔어셈블리↔중간코드 매핑으로 감사 가능성 확보
- x86_64, ARM, RISC-V64 타겟 확장 계획

## 인사이트

재현 가능한 빌드의 신뢰 체인을 처음부터 쌓아가는 프로젝트. 보안과 공급망 무결성이 중요해지는 시대에 의미 있는 작업.
