実行ファイルは SQLite データベースです

2026/08/24 13:48

実行ファイルは SQLite データベースです

RSS: https://news.ycombinator.com/rss

要約

日本語翻訳:

本文は、従来の ELF エキcute を SQLite データベースで置き換え、バイナリをデータベースファイルとして格納する革新的な文件格式「SELF」を提案しています。プログラムヘッダーとシンボルテーブルを SQL スキーマにマッピングすることで、SELF は SQLite の堅牢性を自己記述的な構造体の利点として活用します。オーバーヘッドにより初期サイズは大きくなりますが、オプションのテーブルを削除する戦略的最適化によって、ストリップされた

coreutils
の足場は、元の ELF サイズの 1% 以内にまで削減されます。特に重要なのは、PATH にあるすべての異なるライブラリを含むシステム全体のエキecute とライブラリを単一のデータベースにパックすることで、それらを個別のファイルとして保持したままの総サイズよりも小さい合計サイズを実現できる点です。

実装では、依存関係が外部キーを介して解決される「クロージャー」をサポートし、あいまいなライブラリパスを排除します。動的リンキングは、glibc の

rtld-audit
を使用して SQL 照会を行う方法か、
ld.so
をカスタム C プログラム(
self-ld
)で置き換える方法のいずれかによって実現されます。
LD_PRELOAD
といった高度な慣習は、
preload
テーブルへの挿入などの原子的な SQL トランザクションに簡素化されます。このフォーマットは無損失のラウンドトリップをサポートしており、コアユーティリティを書き直すことなく、既存のツールがバイナリを検査および修正することを可能にします。遅延分析は、データベースを開くための固定コストとして約 5 ms と、比例するコピー時間のコストを示していますが、このプロジェクトでは「hello」などのコマンドが完全にデータベース内で実行される NixOS 環境での実現可能性を実証しています。
fzakaria/selfdb
にホストされたこの統一フォーマットは、開発者が複雑なユーザーランドを管理できるようになり、複雑なカーネルインターフェースの代わりに単純な SQL クエリを使用することを目的としています。

本文

SQLite で ELF バイナリを実行する:SELF (Structured Executable & Linkable Format) の探求

近年、私は主に 2 つの技術に夢中になってきました。 一つは世界を再構築する能力を持つ革新的なツールである「Nix」。 もう一つは、実行ファイル形式として ELF(Executable and Linkable Format) を代替する 「SQLite」 を採用するというものです。

これら 2 つの着想は実に相性が良すぎます。私は博士課程時代にこの考え方を模索しましたが、既存の解決策への慣れ親しんだ人々の**惰性(Inertia)**に直面し、発表されることは叶いませんでした。しかし、このアイデアを放棄することはありませんでした。LLM の進歩に伴い、再度このコンセプトを深掘りする中で、驚くべき現実的な成果が生まれました。

§ 概要:SELF とは何なのか?

私が開発したのは、「実行可能コードを記述するデータベース」ではなく、実際に

chmod +x
して実行可能なファイルそのものを指します。これを**「SELF(Structured Executable & Linkable Format)」**と命名しました。

GitHub で確認できる興味深いプロトタイプでは、ELF ファイルの構造を SQLite のテーブルに変換し、それを直接プログラムとして実行します。

動作のイメージ

# ELF ヘッダー情報に "SELF" と書かれている
$ file hello
hello: SQLite 3.x database, application id 0x53454c46, user version 1

# 通常の実行
$ ./hello
Hello, world!

# SQL クエリでライブラリ依存を確認
$ sqlite3 hello 'SELECT soname FROM ldd'
libc.so.6

§ ELF は「自覚していないデータベース」

ELF も実は既にデータベースですが、多くの機能は手動実装されています。

  • シンボルルックアップ: Bloom Filter (ブルームフィルタ) 等。
  • ツールの冗長性: カーネル、
    ld.so
    、binutils など、同じパースロジックを各自が再実装しています。
  • 形式の硬さ: スキーマは自己記述的ではなく、セクション追加にはゼロ化が必要などの変更が困難です。

対照的に、SQLite は極めて安定した自己記述的な形式で、既存データを壊さずに新機能をサポートできます。ELF を SQLite に置き換えることで、以下のような劇的な変化が可能になります。

§ 何が残されるか (What falls away)

SELF ファイルを実行するには以下の 2 つのテーブルが必須です:

  1. segments
    : ELF ヘッダーやロードイメージを保存(BLOB でプログラムヘッダを格納)。
  2. symbols
    : シンボルテーブル全体を単一の表に集約(
    .gnu.hash
    の代わりとして正規の B-Tree インデックスを使用)。

メタデータの削減と簡素化

  • .dynstr
    の省略
    :
    name
    が TEXT 型のため、SQLite は文字列を自動的にインターン(共有)するからです。
  • バージョニングの単純化:
    .gnu.version_r
    のような複雑な機構は単なるカラムになり、文字列テーブルが不要になります。

デバッグ情報の削除 (
strip
)

プログラムが動作し続ける限り、不要なメタデータを削除できます。これは

VACUUM
DELETE
を含むトランザクションとして処理可能です。

# ライブラリ依存の検索 (ldd)
$ sqlite3 hello 'SELECT soname FROM ldd' 
libc.so.6

# シンボル一覧 (nm)
$ sqlite3 hello 'SELECT name,version FROM imports LIMIT 3'
__libc_start_main|GLIBC_2.34
puts|GLIBC_2.2.5

# セクション情報の削除 (strip)
$ sqlite3 hello "DELETE FROM sections; DELETE FROM notes; VACUUM;"
# サイズ削減: 57344 -> 49152 bytes

# 動作確認
$ ./hello
Hello, world!

スキーマの拡張とビュー (View)

欠落している情報は、ビュー(VIEW)を通じて容易にアクセスできます。

ldd
nm
といった従来のツールは、単なるクエリや結合(JOIN)として実装されます。

-- エクスポートされたシンボル
CREATE VIEW exports AS 
  SELECT name, version, type, size 
  FROM symbols WHERE exported = 1;

-- インポートされたシンボル (未定義)
CREATE VIEW imports AS 
  SELECT name, version 
  FROM symbols WHERE defined = 0;

-- ライブラリ依存一覧 (ldd)
CREATE VIEW ldd     AS 
  SELECT ord, soname FROM needed ORDER BY ord;

§ それはどのように機能するか?

ファイル形式の識別

SQLite ヘッダー(オフセット 68 バイト)には、通常の SQLite と区別するための

application_id
が予約されています。これを SELF に印付けます。

$ xxd -s 64 -l 8 hello
00000040: 0000 0001 5345 4c46                      ....SELF

カーネルレベルでの実行 (
binfmt_misc
)

Linux カーネルの

binfmt_misc
メカニズムを利用することで、この特殊なファイル形式を認識させます。

  • NixOS では数行の設定で、SQLite のマジック番号(オフセット 0)と SELF(オフセット 68)を登録できます。
boot.binfmt.registrations.self = {
  recognitionType = "magic";
  offset = 0;
  magicOrExtension = "SQLite format 3\\x00" + ... + "SELF";
  mask = "\\xff..\\x00..\\x00";
  interpreter = "${self-exec}/bin/self-exec";
};

エグジュート時の仕組み (
elf2self
)

ELF ファイルを SELF に変換するツール

elf2self
を使用します。これは NixOS の
postFixup
フックとしても動作可能です。

  1. 変換: ELF → SQLite データベース (
    elf2self
    )
  2. 識別: カーネルがマジック番号 "SELF" を検知
  3. インタープリタ: 予約されたバイトオフセット(68)を参照し、
    libsqlite3
    をリンクした
    self-exec
    が起動
graph LR;
    elf("elf<br/>hello") -- conv --> self("self<br/>hello<br/>(SQLite db)");
    magic -- "SELF@68" --> binfmt_misc["binfmt_misc"];
    binfmt_misc --> interp["interpreter (self-exec)"];
    interp --> run["running<br/>process"];
    
    subgraph krn ["kernel"]
        direction TB;
        execve["execve()"]
    end
    
    elf -- "magic SELF@68" -.-> magic;
    note["Note:<br/>self-exec は ELF ファイルである必要があります。<br>再帰するインタープリタは -ELOOP になります。"] -.-> self-exec["self-exec"];

インタープリタ (
self-exec
)

self-exec
は、データベースからプログラムヘッダとシンボルテーブルを取得し、メモリにマッピングして再配置(Relocation)を行い、エントリーポイントへジャンプする C プログラムです。その実装は
ld.so
と驚くほど似ています。

§ ダイナミックリンキング

静的リンクは簡単ですが面白くありません。ダイナミックリンキングこそが、データベースの真価を発揮する場所です。 2 つのアプローチを試みました:

  1. rtld-audit:
    glibc
    のインタフェースを使い、ルックアップ処理を SQL クエリに置き換える(素早い反復)。
  2. 完全置換: ルックアップ全体を SQL で実装し、
    ld.so
    を完全に置き換える (
    self-ld
    )。

rtld-audit を使ったルックアップ

glibc の

rtld-audit
インターフェースを介して、
dlopen
やファイル検索をすべてインターセプトします。
RUNPATH
などを辿る代わりに、SQL クエリで「どのライブラリがこのシンボルを満たすか?」を検出します。

# ライブラリを削除
$ rm libgreet.so.1
$ ./app # エラーが発生

# SQL を通じたルックアップ (rtld-audit)
$ SELF_SYSTEM_DB=system.db LD_AUDIT=libself-audit.so ./app
Hello, world, from a SQLite library!

完全 SQL 実装のダイナミックリンカー (
self-ld
)

オブジェクトのマッピング、エクスポート情報の公開、GOT パッチ適用など、すべての処理を SQL で行います。

SELECT s.value + o.load_bias -- シンボルのアドレス計算
FROM   relocations r
JOIN   symbols s ON r.symbol = s.id
JOIN   objects o ON s.object = o.id
WHERE  r.id = ?
ORDER BY o.load_order
LIMIT  1;

§ コストとベンチマーク

新しい形式を定着させる上で、サイズレイテンシが重要な要素です。

サイズ

SELF ファイルは B-Tree オーバーヘッドの影響で、ELF の約 2 倍のサイズになります。ただし、不要なテーブル(デバッグ情報)をストリップすれば、1% 以内の差異まで削減可能です。

分析: 過剰なオーバーヘッドの多くは除去可能ですが、コアな構造(オブジェクト、セグメント、シンボル)は維持されます。

レイテンシ

  • SQLite を開き、インタープリタを起動するには約 5 ms かかります。
  • データベースの B-Tree ページがメモリにマッピングされていないため、イメージサイズに比例したコピーコストが発生します。
    • curl
      (274 KiB) と
      git
      (4.6 MiB) では、ライブラリ数の違いよりもコピーコストの影響を強く受けます。

§ システムはクロージャ(閉じた環境)である

SELF は単一ファイルではなく、プログラムとその**推移的依存関係を含むクロージャ(Closure)**として機能します。

  • 従来の
    ldd
    は曖昧なライブラリ名 (
    soname
    ) しか出力しません。
  • SELF は
    needs
    テーブル
    に解決済みパス (
    resolved_path
    ) を格納し、その曖昧さを解消します。
# クロージャ化 (self closure)
$ self closure "$(readlink -f $(command -v ls))" coreutils.db
ls + closure -> coreutils.db

# 依存関係の明示的なパス表示
$ sqlite3 coreutils.db "SELECT soname, resolved_path FROM needs WHERE is_root = 1"
libc.so.6          /nix/store/xxxxx/lib/libc-2.39.so
libgmp.so.10       /nix/store/yyyyy/lib/libgmp-12.so

これにより、単一のデータベースに実行ファイルと依存ライブラリをパックし、

soname
の曖昧さを完全に排除できます。

§ これはどこまで可能か?一つのファイル、一つのユーザーランド

さらに進んで、システム全体(Userland)のすべての ELF バイナリに対してクロージャ化を行いました。

  • 対象: 723 つの実行可能ファイル、400 の異なる共有ライブラリ。
  • 結果: 1,123 個のオブジェクト、346,386 個のシンボル、3,808 本の依存エッジが、1 つの SQLite ファイル (611.9 MiB) に収まりました。

これにより、以下のような革新的な機能が実現可能です:

  • ライブラリ共有: 同じ
    libc.so.6
    は複数のクロージャ間で共有されます(ストアパス同一)。
  • LD_PRELOAD のトランザクション化: 環境変数ではなくテーブル内の一行として表現され、オン/オフをトランザクション (
    BEGIN
    ...
    COMMIT
    ) で管理できます。
# Preload の動的追加 (1 行の INSERT)
sqlite3 system.db "INSERT INTO preload VALUES (0, 'libmul.so.1.self');"
./app.self  # 動作変化

# プリロードの即時無効化 (DELETE)
sqlite3 system.db 'DELETE FROM preload;'

§ 現在の立ち位置

  • 形式: 完成。ELF と SELF の間でのラウンドトリップは無損失で行えます。
  • ツールング: クエリ、変更、クロージャパッキングが可能。
  • 互換性: glibc プログラムを修正せずとも SQL 通じたルックアップで動作し、ネイティブ SQL ロADER も検証には十分です。

fzakaria/selfdb でコードを確認できます。

nix run .#self-vm
コマンドは、hello が SQLite データベースである NixOS VM を起動します。

Nix には、世界を再構築する自由があります。既存の決定や制約に縛られず、新たなアイデアを探求し、そこから何が生じるかを見ることも可能です。


参考文献:

  1. sqlelf 論文
  2. [.gnu.hash 実装詳細]
  3. [B-Tree マッピングと mmap のパフォーマンス分析]
  4. [NixOS での RUNPATH 最適化]

同じ日のほかのニュース

一覧に戻る →

2026/08/25 0:28

MS Paint および Photo がローカルで生成された出力にも GUID で目に見えない水印を追加する

## Japanese Translation: Microsoft は、デバイス上で AI イメージを生成する方法の根本的な変更を行っており、厳格かつインターネット依存型の検証プロセスを義務付けています。Paint や Photos などのアプリにおいてイメージが確定する前に、システムはサーバーサイドのモデレーション記録にリンクされた不可視のデジタルウォーターマークを埋め込みます。これにより、すべてのローカルで生成されたコンテンツに起源の義務的証拠が付与され、ローカルハードウェアがリモートの監督と直接結び付けられるようになります。以前の方法ではオフラインでの生成が可能でしたが、このアーキテクチャでは常時接続が必要であり、それを欠くと Paint では生成が停止し、Photos では沈黙して失敗するとともにウォーターマークなしのファイルを返します。 技術的な仕組みは、専門化されたモジュールによってピクセルデータを修飾し、C2PA コンテンツクレデンシャルと呼ばれる暗号学的署名を付与することで成り立っています。これらのクレデンシャルは、イメージの一意な識別子をデジタル署名することによりその真正性を保証します。さらに、システムは出力形式を PNG、JPEG、GIF、.paint などが埋め込むのに必要なこのマニフェストデータを保持できるものだけに制限し、任意のマニフェストデータを外部ファイルなしに保存できない BMP ファイルを明示的に除外しています。Microsoft は安全性のためにユーザー識別子を収集しますが、このシフトはデジタルプロヴェナンスがオプションではなくすべての AI 生成ビジュアルに対する必須要件となった新たな業界標準を強化します。ウォーターマーク自体は、画像ブロック全体で各ビットを複数回配置し厳格な完全性チェックを満たすためにコンテンツ適応型アルゴリズムを使用してイメージに符号化され、モデルファイル自体は Copilot+ PC 上で推論を行う前に XOR 符号化されます。

2026/08/25 2:05

ゲームとして再現されたサンフランシスコ市全体

## Japanese Translation: 画面には「THE GAMECITY ONLINE」と表示され、サンフランシスコに設定されたバーチャルシミュレーションが展開されています(ホスト:Apple Inc.(Copyright © 2026))。インタフェースには「NEIGHBORHOOD READY100%」「LOADING」「IDLECENTER」などのステータスインジケーターが表示され、初期の L RANGE メトリックは 470m です。開始するには画面のどこでもクリックすることでテレポートし、フッターテキスト「CLICK TO TELEPORT.」が指示します。移動は WASD キーで歩行、マウス操作で視点を調整、Space でジャンプ、Shift でダッシュ、↑↓ でズームを行います。C キーでカメラビューを調整し、H を押すとグライダーモードが活性化されます。車両輸送は「VVEHICLE」オプションにより有効になります。この中央ハブは足元の移動と車両オプションを統合しており、Apple の 2026 年デジタル基準に基づき、滑らかな都市探検のための標準化された入力方法を提供します。

2026/08/24 22:05

ヨーロッパが創業者とマイクロ企業家を殺している理由

## Japanese Translation: 2026 年 8 月 12 日より施行予定の新しい欧州連合(EU)包装及び包装廃棄物規則(PPWR)は、欧州連合全体での包装に関するルールを調和させることを目的とするが、マイクロ・アントレプレナーの置換化をもたらすリスクがある。拡大製造者責任(EPR)の下で、事業主は包装の収集及びリサイクルを資金調達し、廃棄物が生じる各加盟国において別途登録しなければならない。例えば、4 ヵ国の EU 諸国に対し 25 ユーロのセンサーボードの小口販売を行うギリシャのエンジニアの場合、登録費及び代理人報酬のみで年間約 1,150 ユーロのコンプライアンスコストに直面する可能性がある。Lectronz のデータによると、過去 1 年間で登録された販売者の半数は 10 件の注文未満しか受け取っておらず、これは低ボリュームメーカーへの不均衡な影響を浮き彫りにしている。厳格な執行は、マイクロ・セルラーを EU 市場から撤退させ、関税にもかかわらず非 EU 市場へ売上をシフトさせることを強いる可能性がある。欧州委員会が、指定された国ごとに公式代表者を選任する義務を 2035 年までの一時停止を検討したが、この措置はまだ採択されていない。この規制は芸術家、職人、地場食料生産者、ハードウェアメーカー、ならびに EU の買主に対する販売を行うあらゆる事業に影響を与える。提案されている解決策には、EU 全体の de minimis 閾値の設定、VAT に類似した EU EPR ワンストップショップ(OSS)の創設、ならびに市場プレイスがマイクロ・エンタープライズを集団的に単一の製造者として代表することを許可するものが含まれる。実施においては、 cumbersome なウェブフォームに頼らずコンプライアンスを自動化するために現代のオープン RESTful API とオープンソースソフトウェアを活用することが有益である。Lectronz は現在 5% の手数料を徴収しており、初めの 5 件の販売については免除されており、2026 年を通じて新規の販売者が参入している。具体的アクションのためのリソースには、https://www.change.org/p/stop-destroying-eu-micro-businesses-immediate-moratorium-on-cross-border-epr-fees のオンライン署名運動と、https://ec.europa.eu/info/law/better-regulation/have-your-say/initiatives/15352-Packaging-and-packaging-waste-rules-on-national-registers-of-producers_en の欧州委員会公式フィードバックページが含まれる。即時の改革または臨時の手数料モラトリアムなしでは、多くのクリエイティブかつ地場企業が自らの欧州顧客基盤全体を喪失するリスクに直面している。 ## Text to translate: The new EU Packaging and Packaging Waste Regulation (PPWR), effective from 12 August 2026, aims to harmonize packaging rules across the European Union but risks displacing micro-entrepreneurs. Under Extended Producer Responsibility (EPR), businesses must finance packaging collection and recycling and register separately in every Member State where waste is generated. For example, a Greek engineer selling small batches of €25 sensor boards to four EU countries could face annual compliance costs of approximately €1,150 just for registration and representative fees. Data from Lectronz shows that half of its registered sellers received fewer than 10 orders in the past year, underscoring the disproportionate impact on low-volume makers. Strict enforcement could compel micro-sellers to exit the EU market or shift sales to non-EU markets despite tariffs. Although the European Commission has proposed suspending the requirement to appoint an authorized representative in every destination country until 2035, this measure remains unadopted. The regulation affects a wide range of actors—including artists, craftspeople, local food producers, hardware makers, and any business selling to EU buyers. Proposed remedies include establishing an EU-wide de minimis threshold, creating an EU EPR One Stop Shop (OSS) similar to VAT, and permitting marketplaces to represent micro-enterprises collectively as a single producer. Implementation would benefit from modern open RESTful APIs and open-source software to automate compliance rather than relying on cumbersome web forms; Lectronz currently charges a 5% fee with a waiver on the first five sales and has seen new sellers join in 2026. Actionable resources include an online petition at https://www.change.org/p/stop-destroying-eu-micro-businesses-immediate-moratorium-on-cross-border-epr-fees and the European Commission's public feedback page at https://ec.europa.eu/info/law/better-regulation/have-your-say/initiatives/15352-Packaging-and-packaging-waste-rules-on-national-registers-of-producers_en. Without immediate reform or a temporary fee moratorium, many creative and local businesses risk losing their entire European customer base.