SQLite-файл на Linux можно запустить как бинарник через SELF

Farid Zakaria описал способ сделать файл SQLite на Linux запускаемым бинарником: на 68-м байте заголовка ставят четырёхбайтовый application ID со значением SELF, а части ELF хранят в таблицах базы по авторской схеме — не в обычных секциях исполняемого файла.
Интерпретатор self-exec на C вытаскивает оттуда нужные сегменты и запускает их. Ядро узнаёт такие файлы через binfmt_misc: если в заголовке совпадает маска, Linux передаёт запуск внешнему обработчику вместо попытки исполнить файл напрямую.
Из чего складывается SELF
- application ID SELF — маркер Structured Executable & Linkable Format на 68-й позиции заголовка SQLite
- ELF в таблицах — компоненты образа разложены по схеме автора
- self-exec — интерпретатор собирает и исполняет сегменты
- binfmt_misc — ядро вызывает интерпретатор при совпадении маски
Farid настраивал маску на NixOS; на других дистрибутивах достаточно одной строки для /proc/sys/fs/binfmt_misc/register:
printf '%s\n' ':self:M:68:SELF::/usr/local/bin/self-exec:' \
> /proc/sys/fs/binfmt_misc/registerИсточник: Your executable is a SQLite database.