週次オープンソース: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 には 仕上げるべきデコーダとエンコーダがある。