SQLite 数据库也能当可执行文件

Simon Willison··作者 Simon Willison

关键信息

SQLite 文件格式中的 4 字节应用程序 ID 位于文件第 68 字节处,被设置为 `SELF`,意为 Structured Executable & Linkable Format。ELF 的各个部分通过自定义 schema 分散存放在多个 SQLite 表中,加载器负责取出并执行所需内容;随后 `binfmt_misc` 可让内核把匹配的文件交给 `/usr/local/bin/self-exec` 处理。

资讯摘要

Simon Willison 转述了 Farid Zakaria 的一篇文章,介绍了一种非常特别的 Linux 模式:同一个 SQLite 数据库文件也可以作为可执行二进制文件使用。其核心思路是利用 SQLite 文件格式中的应用程序 ID 字段,这个字段位于文件第 68 字节处,并把它设置为 `SELF`。Zakaria 用这个标记表示 Structured Executable & Linkable Format,说明这个数据库里包含可执行内容。随后,ELF 可执行文件的各个组成部分不是以传统二进制 blob 的形式存放,而是分散放入多个 SQLite 表中。

文章使用了一套自定义 schema 来规定这些部分在数据库中的布局。一个用 C 编写的 `self-exec` 解释器可以读取数据库,提取所需的 ELF 片段并执行它们。文章还指出,Linux 的 `binfmt_misc` 机制可以注册一种匹配规则,让内核在遇到符合该模式的文件时自动调用加载器。示例中,这个注册会把文件交给 `/usr/local/bin/self-exec` 处理,作者也提到自己是在 NixOS 上完成这套配置的,不过支持 `binfmt_misc` 的 Linux 系统通常都可以采用类似做法。

资讯正文

Farid Zakaria 描述了一种巧妙的 Linux 模式,可以创建一个可直接用作可执行二进制文件的 SQLite 数据库文件。

其诀窍是把 SQLite 文件格式中 4 字节的 application ID(在文件中偏移 68 字节处)设为 SELF,代表 Structured Executable & Linkable Format。随后,ELF 可执行文件格式的各个组成部分会按照这个 <a href="https://github.com/fzakaria/selfdb/blob/main/schema/self.sql">schema</a> 被安排进若干不同的 SQLite 表中。

然后,他们的 <code>self-exec</code> 解释器(<a href="https://github.com/fzakaria/selfdb/blob/main/loader/self-exec.c">C 代码在此</a>)就可以提取并执行所需的部分。

你还可以使用一种名为 <a href="https://docs.kernel.org/admin-guide/binfmt-misc.html">binfmt_misc</a> 的 Linux 机制,告诉内核在遇到匹配这种二进制模式的可执行文件时直接执行它。Farid 这里使用的是 NixOS,但如果不用 NixOS,我觉得注册方式大概是这样的:

<pre><code>printf '%s\n' ':self:M:68:SELF::/usr/local/bin/self-exec:' \

&gt; /proc/sys/fs/binfmt_misc/register

</code></pre>

经由 <a href="https://news.ycombinator.com/item?id=49415271">Hacker News</a>

来源与参考

  1. 原始链接
  2. Your executable is a SQLite database

收录于 2026-08-25