2026-09-20

週次オープンソース:qld、Pure-Rust の並列リンカ

今週の新プロジェクトはリンカの qld で、七日間で約 550 コミットを 積んだ。先週日曜の新顔二つも進み続けた:kintane はブートするだけ のカーネルから TCP 越しに Linux プログラムを動かすカーネルへ、 rsasm はさらにターゲットとオブジェクト形式を拾った。CatCard はハードウェアの立ち上げから実際のウォレットへ。rsemu は Amiga のラインナップを埋め、purecrypto は v0.9 に入った。Go から Rust へのコンパイラ rustygo も始まった。

qld:あらゆるリンカの argv を話すリンカ

qld は「Pure-Rust で書いた 高速な並列リンカ(リンクエディタ)」で、GNU ld、gold、lld、mold の ドロップイン置き換えとして設計されている。それらのコマンドラインを 受け付けるので、gcc、clang、rustc はそのまま使える。ライブラリ でもあるので、ツールはプロセス内でリンクできる。ビルドに C ツール チェーンは要らない。唯一の外部コードはコンパイラの LTO プラグインで、 求められたときに実行時にロードされる。出力はスレッド数によらず バイト単位で同一になるよう作られている。

作業は番号付きのワークストリームとマイルストーンに分けられた。今週の マージが記録したもの:

  • アーキテクチャを横断する ELF。 まず静的な x86-64、続いて共有 オブジェクト、PIE と static PIE、そして ELF のクラスとバイト順に 対してジェネリックなリンクパイプライン。その上に AArch64(範囲拡張 サンク付き)、RISC-V 64 と 32、LoongArch64、PowerPC64 LE(ELFv2)、 i386、x32、32 ビット Arm、そして「最初のビッグエンディアン ターゲット」の s390x。
  • 完了条件は実際のプログラム。 M2 のマージには、qld をリンカに して coreutils、curl、OpenSSL、Python、LLVM、rustc、musl をビルド したことが記録されている。M3 ではブートする Linux カーネルと、 バイト単位で一致する raw 出力が加わった。カーネル モジュールと vmlinux は「GNU ld と同じようにリンクされる」。
  • ほかの形式。 MinGW 流儀の PE/COFF(auto-import、実行時の 疑似リロケーション、短いインポートライブラリ付き)。Mach-O の リーダ、続いて dylib、TLS、__unwind_info と C++ 例外、arm64e のポインタ認証、libLTO 経由の LTO。macOS の CI ジョブは zlib、 Lua、SQLite、{fmt} をビルドする。
  • リンカの機能。 GNU リンカスクリプト、--gc-sections、ICF、 --gdb-index と --debug-names、--separate-debug-file、 GCC/LLVM の LTO プラグインインタフェース(マイルストーン M6)。 未定義シンボルのヒントは、そのシンボルを定義するライブラリを 指し示す。
  • 測られた速度。 実際のリンクを記録し、GNU ld、lld、mold、wild、 qld で再生するベンチマークスイート。効いた高速化と、効かなかった 試み(「専用の書き込みスレッド、もう一度試したが効かない」)の 両方が記録されている。

kintane:ブートから Linux プログラムへ

先週日曜に始まった Rust カーネル kintane は約 390 コミットを積み、その進み具合をロードマップに回ごとに記録した(週末 までに二十一回)。入ったものの一部:

  • ストレージ。 ブロック層と virtio-blk(最初の DMA ドライバ)、 続いて VFS とブロックキャッシュ、FAT16 の読み込み、そして順序付き ライトバックキャッシュ経由での書き込み、長い名前付きの FAT32、 クラッシュテスト、どのプロセスも接続できる常駐ファイルサーバ。
  • 隔離。 ディスクの DMA を閉じ込める Intel VT-d IOMMU ドライバ、 割り込みリマッピング、MSI-X、そして x86-64 の ring 3 ドライバ ドメインで動く virtio-blk-core(「Phase 5 の出口」)。aarch64 ではデバイスツリーから SMMUv3 と PCIe ホストブリッジを見つける ようになった。
  • ネットワーク。 virtio-net、IPv4 スタック、輻輳制御・SACK・ 高速再送付きの TCP と IPv4 再組み立て、データグラムソケット、 poll / select / epoll。ネットワークの試験では、kbuild 自身が回線の向こう側の相手役を務める。
  • Linux personality。 最初はディスクから未修正の静的プログラムを 一つ動かすところからだった。週末にはスレッド、パイプ、fork、 execve、wait4 が x86-64 と aarch64 で動き、シグナル(リアル タイムシグナル、SIGCHLD、停止と再開を含む)、ソケット呼び出し、 getdents64、statfs も揃った。
  • 長く走らせる。 ストレスと soak モード、ランダム化した構成、 そして PCI 割り込みのルーティングのための AML インタプリタ(QEMU の DSDT を種にファジング済み)。「24 時間の soak を走らせ、それが 何かを見つけた」。

CatCard:立ち上げからウォレットへ

Coldcard ハードウェア向けのクリーンルーム Rust ファームウェア CatCard は、約 345 コミットで USB と SD の立ち上げからウォレット機能へ進んだ。ウォレット はデバイス自身のエントロピーから作る。すべての源を混ぜ、「信頼できる ものだけを勘定に入れる」——mk3 の SE1 の TRNG もそこに含まれる。 Address Explorer は四種類のアドレスを閲覧できる。署名はレガシー、 ネスト、taproot の PSBT 入力をカバーし、厳格でアロケーション不要の PSBT v0 リーダを通る。登録済みのマルチシグウォレット、RAM のみの パスフレーズウォレット、メッセージ署名もある。秘密鍵の処理は割り込み をマスクして走り、それは型で強制される。

Q1 ではメニューがアイコンのグリッドになり、QR スキャナは BBQr と BC-UR を読み、エクスポート先は SD、BBQr、BC-UR から選べる。純正 ファームウェアが書いた設定ストアと Secure Notes を読めるほか、SD カードを USB ドライブとして見せることもできる。ゲームも二つある: Flappy Cat と Block Cutter。部品は共有のクレートだ。 outscript-rs は no_std・no-alloc になり、PSBT、taproot のスクリプトパス、BBQr / BC-UR のトランスポートを得た(v0.1.3 から v0.2.5)。CatCard は今や 自前のものではなくそのコーデックを使う。設定の JSON を読むのは emjson で、数百バイトの RAM で動く新しいストリーミング JSON パーサ・ライタ・その場エディタだ。

purecrypto:v0.9

purecrypto は v0.8.7 から v0.9.1 へ進んだ。プロトコル側では、nameConstraints の すべての形を強制し、X.509 と TLS で RSA-PSS を尊重し、TLS 1.2 で RFC 7250 の raw 公開鍵が使えるようになり、QUIC は X25519MLKEM768 を 提示し、DTLS は ALPN を交渉する。LMS はレベルごとの状態を持つ HSS と キャッシュされたマークル木を得て、署名が O(h) になった。v0.9.1 の 新アルゴリズム:JOSE(JWK、JWS、JWE)、RFC 9380 の hash-to-curve 付き BLS12-381、FIPS 186-4 DSA、NIST FF1 フォーマット保存暗号、C2SP の チャンク暗号化、SipHash と VMAC、そして暗号の一群(AES-EAX、SEED、 MORUS、AEGIS-128、Ascon v1.2)。下流の tsslib-rs は purecrypto 0.9 に移り、リシェアリングのハングと、閾値 ML-DSA の rogue-key 攻撃を修正した。

rsemu:残りの Amiga

rsemu は 68010、68020、 68030(MMU 付き)と 68881/68882 FPU を加え、それとともに Amiga の ラインナップの大半を揃えた:Enhanced Chip Set の A500+ と A600 (A600 は Gayle の IDE ポート付き)、「Kickstart 3.1 が Workbench 3.1 を起動する」AGA の A1200、そして Akiko と CD-ROM ドライブを 含む「アニメーション画面まで起動する」CD32。Paula の音声は録音したり ブラウザのタブで再生したりできる。PC 側では VGA と VBE 2.0、El Torito ブート付きの ATAPI CD-ROM、ホットスワップできるフロッピー。 WebAssembly の JIT バックエンドも入り、engine = "jit-wasm" で選べる。

rsasm:さらに多くのターゲットとオブジェクト形式

rsasm は AVR(avr-elf-as と「形ごとに」照合)、MSP430/MSP430X、Intel 8051、そして FPU と MMU を含む 680x0 ファミリの残りを加えた。ELF のほかに、x86-64・i386・ ARM64 の PE/COFF、NASM 流の win32 と win64 オブジェクト、x86-64 と arm64 の Mach-O、Intel HEX を書けるようになった。.loc と .cfi_* から .debug_line と .eh_frame も出力し、一般的な 6502、Z80、8080 のソースを ca65 と vasm と照合しながら読む。

今週その他

  • 新顔 rustygo:Go から Rust へのコンパイラ。Go のパッケージを Rust ランタイム付きの Rust ソースにコンパイルし、cgo も FFI もなしに Go と Rust が一つの バイナリを共有する。一週間で M0(単一ゴルーチンの Go を gc と照合) と M1 の大半に到達した:スライス、マップ、クロージャ、 インタフェース、defer/panic/recover、正確なマーク&スイープ コレクタ、そして本物の標準ライブラリからコンパイルした strings、 strconv、sort、errors。物差しは Go 自身の test/ ディレクトリで、この時点で 141 中 34。
  • 1D/2D バーコードライブラリ anydcode は、規格 適合の修正(Aztec、DataBar、DotCode、Code 16K、PDF417)とライブ カメラ検出器の作業を経て v0.2.0 をリリースした。
  • 新顔 oxideav-heif: oxideav 向けの HEIF / HEIC / MIAF コンテナ。最初のコミットは ボックスリーダ、grid/overlay/identity の派生、レジストリ経由で デコードする HEVC と AV1 のアイテム、シーケンス、ライタをカバー する。
  • 新顔 minizlib: no_std・no-alloc の gzip/zlib/deflate デコンプレッサと小さな コンプレッサで、コード量をできるだけ小さくするように作られている (v0.1.0 と v0.1.1)。

来週

qld は最初のリリースへ向かう。kintane は回ごとに進み続ける。rustygo はゴルーチンと標準ライブラリのさらに多くの部分へ。CatCard には純正 ファームウェアとの機能対応表を片付ける仕事が、oxideav-heif には 仕上げるべきデコーダとエンコーダがある。