你的可执行文件其实是一个 SQLite 数据库

Executable Is a SQLite Database

你的可执行文件其实是一个 SQLite 数据库

我最近沉迷于一个大胆的想法:用 SQLite 彻底取代 ELF 作为可执行文件格式。ELF 本质上已经是一个拒绝承认的数据库,却需要各种工具重复解析。我开发了 SELF 原型,将程序头、符号表直接存入 SQLite,让 strip 变成简单的 DELETE 事务,让 ldd 变成 SQL 查询。虽然文件体积略有增加,但动态链接完全可以通过 SQL 实现。这不仅简化了工具链,更让二进制文件变得像数据库一样可查询、可扩展。

ELF 本质上是一个拒绝承认自己身份数据库。
  1. andai

    整篇文章都很棒,但光是开头提到的 SQLite 虚拟表(virtual tables)功能就让我大开眼界。

    https://www.sqlite.org/vtablist.html

    你可以把文件系统(或任何东西)“挂载”成一个 SQL 数据库,这也太离谱了。简直不可思议。

    这听起来会非常有用。

  2. setheron

    (作者)我很享受这些评论。

    当我在学术圈发表一篇关于这个想法的短文时,收到的反馈可没这么友好。

  3. inigyou

    > 我意识到了一件一直困扰我的事。ELF 本身就是一个数据库。

    更广泛地说:任何数据基础本质上都是数据库(这就是这个复合词的含义)。像 sqlite 和 postgres 这样的程序过去被称为更精确的术语“关系型数据库管理软件”或“RDBMS”,直到它们的普及程度之高,以至于人们口语中直接称它们为数据库。

    最早的数据结构更像是:硬盘的每个几何扇区是一条记录,每个磁头是一列。这是将打孔卡工作流程直接翻译成磁盘的结果。

  4. XJ6w9dTdM

    没错!

    这个想法在我脑海里盘旋已久。正如其他评论者所指出的,如果文件能包含(可自修改的)Lisp 镜像、内置虚拟文件系统,以及应用程序想要用作(运行时可修改)的额外表,那就太好了。

    我发现 SQLite 的动态链接与 ELF 动态链接基本兼容,这令人印象深刻。我想象如果做得好,它就能像作者建议的那样,用一种更高效的格式取代大多数 AppImages 的用途。

    既然作者提到你无法直接 mmap 文本页,无论如何都得复制,那么有没有一个选项可以压缩 SQLite blob 内部的段内容呢?

    我想到了两个扩展,能让 SQLite 可执行文件真正独一无二。

    首先,是一个链接扩展,允许更直接地修补函数和钩子,从而实现一个非常强大的插件系统。想象一下,插件 SQLite 为宿主 SQLite 定义为可扩展的某个符号定义 BEFORE/AFTER/REPLACE 钩子。

    其次,是运行时重新链接。这需要应用程序作者的配合,因为你无法从任意地方做到这一点,但想象一下,通过编辑数据库在运行时更改依赖项或加载插件,解释器就在后台按需/自动地映射它,下次你的 Web 服务器调用 accept() 时,它调用的就是处理函数的新版本。

  5. djoldman

    > 该格式本身极其紧凑,设计初衷是为了应对磁盘空间和网络带宽极度稀缺的世界。修改该格式很困难,由于打包得非常紧密,你经常需要清零某些段并添加新段。此外,它也没有自描述的模式(schema)。ELF 本身是一种非常通用的格式,支持按惯例以特定方式解释的数据段,但格式本身并不强制执行这种解释。

    这听起来非常适合以下用途:

    1. ELF 文件转 SELF 文件

    2. 修改 SELF 文件

    3. SELF 文件转 ELF 文件

  6. garganzol

    复制内存与映射内存的情况是这次实验唯一的致命缺陷。否则,文件格式的统一将是一个巨大的进步。Windows(以及一些旧版 Unix 系统)使用的 PE/COFF 可执行文件格式也是一种关系型数据库。.NET 程序集格式也是如此——它也是一种关系型数据库。轮子总是被一遍又一遍地重新发明。

  7. catlifeonmars

    我能接受对象文件可以被视为关系型数据库的观点。但为什么要用 SQLite 呢?为什么不使用基于虚拟表抽象的 SQL 查询引擎来处理对象文件呢?我没看出除了查询引擎的子集外,大多数 SQLite 功能是如何迁移过来的。

    如果作者想论证在对象文件中包含模式元数据,那又为什么要用 SQLite 呢?这让我觉得某人是在试图为他们最喜欢的锤子(虽然这是一把非常有用的锤子)寻找用途,而不是在认真探索一种新的、改进的对象文件格式应该是什么样子。

    (这完全没问题)

  8. unified101

    我觉得这还不够!让真正的应用商店就是文件本身。这样它就是一个活着的应用,文件会根据你的使用情况不断更新。复制它到处跑,你的数据也随身带着。

    让我们再深入一点。它是一个 Web 服务器应用 + 服务器代码 + 应用程序代码 + 数据库,也就是 pocketbase++,同时它也是部署目标。

    然后把它和类似 APE 的系统结合起来,同一个文件就能在所有平台上加载和存储东西。邪恶的笑声

    非常酷的黑客精神!向作者致敬。

同日更多故事

2026-08-24