Исполняемый файл как база данных SQLite¶
5.0/10
Контекст¶
Саймон Уиллисон пересказывает приём Фарида Закарии, который позволяет сделать файл базы данных SQLite напрямую исполняемым в Linux. Обычно формат данных и формат исполняемого файла никак не связаны, но здесь они объединяются в одном файле.
Суть¶
Идея в том, чтобы записать в 4-байтовый application ID SQLite-файла (на смещении 68) значение SELF — Structured Executable & Linkable Format. Компоненты ELF-исполняемого файла раскладываются по разным таблицам SQLite, а специальный интерпретатор self-exec, написанный на C, извлекает и запускает нужные части. Дополнительно можно использовать механизм binfmt_misc, чтобы ядро само распознавало такие файлы по бинарному шаблону и передавало их интерпретатору. Закария показывает это на NixOS, а Уиллисон приводит пример регистрации без NixOS: запись строки вида «:self:M:68:SELF::/usr/local/bin/self-exec:» в /proc/sys/fs/binfmt_misc/register. Такой подход делает исполняемый файл одновременно полноценной базой данных, с которой можно работать обычными SQLite-инструментами.
Вывод¶
По мнению автора, этот паттерн показывает, что границы между исполняемыми форматами и форматами данных можно гибко стирать, используя стандартные механизмы Linux и особенности SQLite. Это изящная демонстрация того, как application ID и binfmt_misc превращают базу данных в исполняемый файл.