Bootstrapの世界

2026/02/01 山D

自己紹介

一般Gentoo Linuxユーザ

ホムペ: https://dyama.net
メール: me@dyama.net
Twitter: @_yamader
Misskey: @yamad@msk.seppuku.club
OpenPGP: 0E3E 1098 B312 9A37 AFE6 A5CF 596E 6A41 B551 7736

OSをコンパイル,してますか?

GNU の主張:

Thompson's Hack

  • Trusting Trust Attack
  • Quine (自分自身を出力するプログラム)
  • Ken Thompsonはコンパイラにこれを仕込んだ
    • UNIXのlogin関数にバックドアを仕込むコンパイラ
    • このコンパイラで対象のコンパイラをコンパイルすると
      バックドアを仕込むコードを含むコンパイラが出力される

用語の整理 (狭義)

  • 高級言語: 高級な言語
  • 低級言語: アセンブリ
  • (言語)処理系: 言語を受け取って動作する機械
    • コンパイラのことを処理系と呼ぶこともある(主にC++)
  • コンパイラ: 高級言語 → 低級言語 の翻訳機
  • アセンブラ: 低級言語 → 機械語 の翻訳機
  • トランスパイラ: 高級言語 → 高級言語 の翻訳機
  • インタプリタ: 高級言語を受理して動作する処理系

各種処理系の実装言語

ところで……

  • CPython: C
  • ≤Go-1.4: C
  • rustc: Rust (formerly OCaml)
    • LLVM: C++
  • mrustc: C++
  • OCaml: OCaml (formerly some Lisp dialect)
  • JDK: Java
  • GHC: Haskell

C/C++処理系の実装言語

  • GCC: C++
  • ≤GCC-4.7: C
  • binutils (アセンブラ): C
  • Clang/LLVM: C++
  • TinyCC: C
  • ChibiCC: C
  • MesCC: Scheme

コンパイラをコンパイルするにはコンパイラが必要

鶏が先か,卵が先か

Let's Bootstrap!

説明は有志Webに丸投げ
https://bootstrappable.org

OpenJDKとかGHCとかが曲者らしい

Guixの場合:

GCC / Binutils

https://guix.gnu.org/blog/2023/the-full-source-bootstrap-building-from-source-all-the-way-down/

live-bootstrapの場合:

https://github.com/fosslinux/live-bootstrap

kaem: タスクランナー

i686-unknown-linux-muslのツールチェーン・環境が出力されるので,x86_64-pc-linux-gnuのツールチェーンを頑張ってコンパイルする

stage0-posix

hex0 → ... → cc_x86 → ... → GNU Mes → TinyCC → ... → GCC

https://github.com/oriansj/stage0-posix#how-does-this-process-work
https://github.com/oriansj/stage0-posix-x86/blob/master/cc_x86.M1
https://www.gnu.org/software/mes/

hex0

アセンブリで書かれたアセンブラ
**181Bytes**

https://github.com/oriansj/bootstrap-seeds/blob/master/POSIX/x86/hex0_x86.hex0

Linux From Scratch

ホストのコンパイラを使う

https://www.linuxfromscratch.org/lfs/view/stable/

Gentoo From Scratch w/ live-bootstrap

live-bootstrap → x86_64-pc-linux-gnu → Portage → Catalyst

% docker buildx create \
    --buildkitd-flags '--allow-insecure-entitlement security.insecure' \
    --driver-opt env.BUILDKIT_STEP_LOG_MAX_SIZE=-1,env.BUILDKIT_STEP_LOG_MAX_SPEED=-1 \
    --name gentoo-builder \
    --use
% docker buildx build --allow security.insecure --progress plain -o dist .

https://github.com/yamader/gentoo-from-scratch/blob/master/Dockerfile

成果物

https://ftp.dyama.net/pub/gentoo-from-scratch/