وقتی فایل اجرایی یه دیتابیس SQLiteه
خلاصهٔ کاملتر
فرانک زکریا، که سالها رو Nix و فرمتهای اجرایی کار کرده، تو این پست از یه ایده تجربی میگه: جایگزین کردن ELF (فرمت استاندارد فایلهای اجرایی لینوکس) با یه فایل دیتابیس SQLite واقعی. نه یه دیتابیس که ELF رو توصیف کنه، بلکه خود همون فایلی که chmod +x میکنی و اجراش میکنی. اسم پروژه رو گذاشته SELF (Structured Executable & Linkable Format) و کدش رو روی گیتهاب گذاشته.
به گفته نویسنده، ELF از اول یه دیتابیسه که خودشو دیتابیس نمیدونه: جدول رشتهها (.strtab)، ایندکس نمادها (.hash)، جدول بخشها، همه معادل مستقیم دارن تو دنیای دیتابیس، فقط دستی و بدون schema پیادهسازی شدن. تو SELF، اینها میشن جدولهای واقعی SQL: یه جدول segments برای بخشهای قابل بارگذاری برنامه با محتوا بهصورت BLOB، و یه جدول symbols با ایندکس روی اسم.
این یعنی دستوراتی مثل ldd، nm یا readelf دیگه لازم نیست پارسر مخصوص خودشون رو داشته باشن؛ فقط یه SELECT روی جدولهای مناسبن. حتی strip (حذف اطلاعات دیباگ) میشه یه DELETE + VACUUM تو یه تراکنش، و patchelf هم یه UPDATE سادهست.
برای اجرا شدن، از مکانیزم binfmt_misc کرنل لینوکس استفاده میکنه که میذاره یه بایت خاص تو هدر فایل (که SQLite برای همین منظور رزرو کرده) رو به یه مفسر خاص وصل کنی. یه برنامه کوچیک C به اسم self-exec این مفسره؛ هدرها و جدول نمادها رو از دیتابیس میخونه، بخشهای قابل اجرا رو تو حافظه map میکنه و میپره سراغ نقطه شروع برنامه.
برای لینک داینامیک هم دو راه امتحان کرده: یکی نگهداشتن ld.so معمولی و فقط عوض کردن جستجوی کتابخونهها با یه پرسوجوی SQL از راه رابط rtld-audit، و یکی هم ساخت یه لینکر داینامیک کاملا جدید به اسم self-ld که همهچیز رو با SQL انجام میده و تو عمل هم کار میکنه.
از نظر حجم، یه فایل SELF تقریبا دو برابر ELF معادلشه، ولی بیشتر این هزینه مال جدولهای اختیاری دیباگه؛ بعد از حذفشون فرق حجم به کمتر از ۱٪ میرسه. سرعت اجرا هم حدود ۵ میلیثانیه اضافه تاخیر داره، چون صفحات دیتابیس برخلاف ELF مستقیم map نمیشن. نکته جالبتر اینه که وقتی نویسنده همه ۷۲۳ فایل اجرایی سیستمش با ۴۰۰ کتابخونهشون رو تو یه فایل SQLite بستهبندی کرده، حجم کل از مجموع فایلهای ELF کمتر بوده (۶۱۱.۹ مگابایت در برابر ۶۴۴.۴ مگابایت)، چون کتابخونههای مشترک فقط یه بار ذخیره میشن.
نکات کلیدی:
- SELF یه فرمت اجرایی تجربیه که فایل SQLite رو مستقیم قابل اجرا میکنه، نه فقط توصیفکننده ELF
- کدش با اسم fzakaria/selfdb روی گیتهاب منتشر شده؛ با nix run .#self-vm میشه یه ماشین مجازی NixOS رو امتحان کرد که hello توش یه فایل SQLiteه
- یه SELF استریپنشده تقریبا دو برابر حجم ELF معادلشه، ولی بعد از حذف جدولهای اختیاری فرق به کمتر از ۱٪ میرسه
- بستهبندی کل یوزرلند لینوکس (۷۲۳ فایل اجرایی، ۴۰۰ کتابخونه) تو یه فایل SQLite واحد، ۶۱۱.۹ مگابایت شده در برابر ۶۴۴.۴ مگابایت مجموع فایلهای ELF




