Fil-C 사용에 대한 djb의 노트

8 hours ago 2

  • 메모리 안전성을 갖춘 새로운 C/C++ 컴파일러 Fil-C는 기존 코드와의 높은 호환성을 보이며, 대부분의 라이브러리와 애플리케이션이 수정 없이 작동
  • Debian 13 환경에서 Fil-C를 소스 빌드 및 설치하는 절차와, glibc·binutils를 Fil-C로 재컴파일하는 자동 설치 스크립트 제공
  • 9000개 암호화 소프트웨어 마이크로벤치마크에서 Fil-C는 clang 대비 1~4배의 사이클 수를 사용
  • Fil-C로 Debian 패키지 빌드 체계 통합을 시도하며, 새로운 ABI(amd64fil0)를 추가해 Fil-C 기반 패키지 병행 설치 가능 구조 제시
  • Fil-C는 메모리 안전성과 기존 생태계 호환성을 동시에 추구하며, Debian 기반 시스템으로의 확장 가능성을 보여줌

Fil-C 개요 및 초기 인상

  • Fil-C는 메모리 안전성을 보장하는 C/C++ 컴파일러로, 기존 코드와의 높은 호환성을 보임
    • 대부분의 라이브러리와 애플리케이션이 수정 없이 작동
    • 예외적으로 수정이 필요한 경우도 해결이 어려운 수준은 아님
  • 작성자는 관리 중인 여러 시스템을 Fil-C로 컴파일된 코드로 전환해 보호하는 것을 목표로 함
  • 테스트 환경은 Debian 13, AMD Ryzen 5 7640HS(6코어 12스레드), 12GB RAM, 36GB 스왑 메모리

관련 자료 및 스크립트

  • Fil-C와 상위 소스(예: clang, glibc) 간의 차이를 비교하는 감사용 diff 스크립트 공개
  • Debian 13에서 Fil-C, glibc, binutils를 다운로드·컴파일·설치하는 filian-install-compiler 스크립트 제공
    • 전체 실행 시간: 실시간 86분, 사용자 시간 477분, 시스템 시간 52분
  • Fil-C를 이용해 Debian 소스 패키지를 빌드하는 filian-install-packages 스크립트 제공
    • 일부 패키지(bzip2 등)는 정상 빌드 확인
  • Fil-C vs. clang 성능 그래프 공개
    • 약 9000개 암호화 관련 마이크로벤치마크 결과
    • Fil-C로 컴파일된 코드는 clang 대비 1~4배의 사이클 소모

Fil-C 설치 및 빌드

  • root 권한으로 필요한 패키지 설치 후, 비특권 사용자 filc로 빌드 수행
  • Fil-C 소스는 glibc 및 여러 고수준 라이브러리·애플리케이션을 포함
  • 빌드 명령: time ./build_all_fast_glibc.sh
    • musl도 선택 가능하지만 일부 패키지(attr, elfutils, sed, vim 등)와 비호환성 존재
  • 빌드 중 메모리 부족 발생 시 스왑 공간을 36GB로 확장해 해결
    • 최대 약 19GB 스왑과 12GB RAM 사용
    • 대형 서버(128코어, 512GB RAM)에서는 Fil-C 빌드 8분, musl 빌드 6분 소요

추가 라이브러리 및 애플리케이션 빌드

  • Fil-C에는 여러 라이브러리와 애플리케이션을 빌드하는 build_all_slow.sh 포함
  • 이를 병렬화한 build-parallel-20251023.py 스크립트 작성
    • 오류 발생 시 중단하지 않고 전체 빌드 진행
    • 병렬 빌드로 시간 단축 가능
  • phoenix 시스템에서 61개 타깃 중 60개 성공 (실시간 101분)
  • libcap만 빌드 실패 (liblto_plugin.so 로드 오류)
  • util-linux는 syscall 관련 수정 필요
  • 나머지 주요 패키지(attr, bash, curl, openssl, vim 등)는 문제 없이 빌드 완료

추가 테스트된 라이브러리 및 애플리케이션

  • boost 1.89.0: 대부분 정상 작동, 일부 vfork 관련 수정 필요
  • cdb-20251021: 정상 작동, 인위적 OOM 테스트에서 오류 메시지 차이
  • libcpucycles, libgc(gshim 대체), libntruprime, lpeg, luv 등 정상 빌드 및 테스트
  • mutt, tig, w3m 등 주요 CLI 애플리케이션도 정상 동작 확인

Debian 통합 (Filian)

  • Debian의 다중 아키텍처 구조를 활용해 Fil-C 전용 ABI(amd64fil0) 추가
    • 예: apt install bash:amd64fil0로 Fil-C 컴파일 버전 설치 가능
  • Fil-C는 /usr/include 대신 자체 디렉터리를 사용해 헤더 파일 경로 불일치 문제 발생
    • filian-install-compiler 스크립트에서 이를 Debian 표준 경로로 조정
  • Debian 빌드 도구(dpdk-buildpackage, sbuild 등)에 Fil-C 아키텍처 인식 추가
    • /usr/share/dpkg/cputable, config.sub 등 수정
  • Fil-C 및 표준 라이브러리를 /usr/libexec/fil/amd64 경로에 배치
    • filcc, fil++ 명령을 시스템 전역에서 사용 가능

Debian 패키지 빌드 예시

  • fillet 헬퍼 스크립트로 Debian 소스 패키지의 심볼 및 설치 경로 조정
  • tinycdb 패키지를 Fil-C로 빌드한 결과, amd64fil0 전용 .deb 패키지 3개 생성
    • 설치 후 nm, ldd 명령으로 Fil-C 심볼(pizlonated_) 및 라이브러리 경로 확인
    • 실행 시 Fil-C 런타임 보호 기능 작동 확인 (“memory safety” 위반 차단 메시지 출력)

추가 Debian 패키지 빌드

  • libc-dev: 의존성 해결용 가짜 패키지 생성
  • ncurses: Fil-C로 빌드 후 설치 가능
  • libmd: 아키텍처 간 버전 불일치로 재컴파일 필요
  • readline: 헤더 경로 심볼릭 링크 필요
  • lua5.4: readline 의존성 해결 후 정상 작동

결론

  • Fil-C는 메모리 안전성 강화와 기존 C/C++ 생태계 호환성을 동시에 달성하려는 시도
  • Debian 환경에서의 패키지 빌드 및 통합 가능성이 입증됨
  • 일부 빌드 스크립트와 헤더 경로 조정이 필요하지만, 대부분의 주요 오픈소스 패키지와 호환성 확보

Read Entire Article