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:' \
> /proc/sys/fs/binfmt_misc/register
</code></pre>
经由 <a href="https://news.ycombinator.com/item?id=49415271">Hacker News</a>
来源与参考
收录于 2026-08-25