概要
- Nix と ELFの代替としてのSQLite に対する著者の執着
- sqlelf や SELF (Structured Executable & Linkable Format)などのプロトタイプ開発
- ELFの本質的な課題 と SQLiteを実行可能フォーマットとして使う利点
- SELFファイル構造 と ツール連携の容易さ
- サイズ・起動速度の比較 や システムとしての応用可能性
NixとSELF:新たな実行可能フォーマットの探求
- Nix は革新的なアイデア実現のためのツールとして活用
- ELFの代替 として SQLite を実行可能フォーマットに利用する着想
- PhD研究時から着想を温め、 sqlelf というSQLでELFを探索できるツールを開発
- SELECT name FROM elf_symbols などSQLでELF内部解析が可能
- SELF (Structured Executable & Linkable Format)というプロトタイプをGitHubで公開
ELFは「隠れたデータベース」
- ELF は実は多くの データベース的構造 を自前実装している
- 例: .strtab/.dynstr =文字列インターン、 .hash/.gnu.hash =インデックス、 section header table =テーブルスキーマ
- SQLite は自己記述型・拡張性・安定性に優れ、クエリによる柔軟な情報取得が可能
- ELF は編集や拡張が困難だが、 SQLite ならスキーマ拡張や不要データ削除も容易
SELFファイルの構造と利点
- 実行に必要なのは self_meta (ELFヘッダーのkey-value)と segments (プログラムヘッダーごとのBLOB)の2テーブル
- 例: segments テーブルは各セグメントの属性やバイト列を格納
- symbols テーブルでシンボル情報を一元管理し、 .gnu.hash などの複雑な構造を排除
- インデックスも SQLite のB-treeで高速化
- 不要なメタデータ(sections, notes, dynamic_entries)は削除可能
- 削除は DELETE と VACUUM でトランザクション的に実現
SELFファイルの実行とツール連携
- SQLiteのapplication_id (68バイト目)に"SELF"を設定し、 binfmt_misc で新フォーマットとして登録
- self-exec というインタプリタでSELFファイルを実行
- elf2self ツールでELFからSELFへの変換が可能
- 既存のツール操作(ldd, nm, readelf, strip等)はSQLクエリで代替可能
- 例: strip はDELETE & VACUUM、 patchelf はUPDATE
- ビュー や JOIN で複雑な情報も容易に抽出
動的リンクの実装
- glibcのrtld-audit を利用し、シンボル解決をSQLクエリで実現
- self-ld という完全SQLベースの動的リンカもプロトタイプ化
- 共有ライブラリの探索やバインドもデータベース操作で完結
サイズ・起動速度の比較
- SELFファイル はSQLiteのB-tree分だけELFより大きいが、不要テーブル削除でほぼ同等サイズに圧縮可
- 起動時は SQLiteオープンの固定コスト(約5ms) と BLOBコピー によるオーバーヘッド
- ELFのmmapによるページ共有は不可
システム全体を単一ファイル化
- SELF は単一実行ファイルだけでなく、 依存ライブラリも内包したクローズドなシステム としても利用可能
- 依存解決や配布の簡易化に寄与
まとめ:SELF/SQLiteベース実行フォーマットの可能性
- ELF の複雑性や拡張性の低さを克服する新しい実行フォーマットの提案
- SQLite の持つ自己記述性・拡張性・トランザクション性を活かした実装
- ツール連携の容易さ や システムの一体化 など、従来のELFにはない柔軟性
- 実用化にはさらなる最適化や標準化が課題だが、 新しいパラダイムへの一歩