← Home

SELF

31 August, 2026 - Tags: TIL, database

最近看到一篇文章 Your executable is a SQLite database 在講一個很酷的專案 SELF (Structured Executable & Linkable Format),這概念來自於作者 Farid Zakaria 在大約三年前的專案 sqlelf,一款可以透過 sqlite 讀取 ELF 的工具,他有點類似 readelf,但是把純文字的輸出都變成了 SQL,所以我們可以在 parse 完成之後用 SQL 語法去操作,例如下面是 blog 上面的範例。

$ sqlelf /usr/bin/ruby /bin/ls /usr/bin/pnmarith
sqlite> SELECT elf_headers.path, COUNT(*) as num_sections
    ..> FROM elf_headers
    ..> INNER JOIN elf_sections ON elf_headers.path = elf_sections.path
    ..> WHERE elf_headers.type = 3
    ..> GROUP BY elf_headers.path;
path|num_sections
/bin/ls|31
/usr/bin/pnmarith|27
/usr/bin/ruby|28

而 SELF 進一步強化了這個想法,它把 SQLite 資料庫直接當作執行檔跑起來。他的原理是透過設定 SQLite 的 application_id,加上 Linux 的 binfmt_misc subsystem 來讓 kernel 可以知道要使用什麼 interpreter 執行該檔案。

記得我在很久以前就看過 SQLite 網站上面的 What If OpenDocument Used SQLite?,在討論如果 ODP (OpenDocument Presentaion) 檔案格式從現在基於 ZIP 的實作換成基於 SQLite 的實作可能會帶來什麼好處;另外一些軟體像是 Krita 則是真的有在他們的資料儲存使用到 SQLite。可以看出在某些時候考慮使用 SQLite 會是蠻不錯的選項,除了結構化資料帶來的方便查詢,SQL 本身的 ACID 特性也會讓 in-place 更新檔案變得簡單等等。事實上,上面提到的 application_id 似乎就是 SQLite 為了支援這種 usecase 保留的特性,對應的官方文件在 SQLite As An Application File Format。