
نموذج أولي يحوّل صيغة الملفات التنفيذية إلى قاعدة بيانات SQLite
طوّر المبرمج فريد زكريا نموذجاً أولياً يُدعى SELF يخزّن البرنامج ومكتباته كلها في قاعدة بيانات SQLite واحدة، ويستبدل أدوات مثل readelf وldd وحتى strip باستعلامات SQL مباشرة.
نشر المطوّر فريد زكريا نموذجاً أولياً يستبدل صيغة الملفات الثنائية ELF بقاعدة بيانات SQLite. يُدعى المشروع SELF، أي «الصيغة المنظّمة القابلة للتنفيذ والربط»: الناتج ملف SQLite عادي يُمنح صلاحية التنفيذ ويعمل فعلاً، بينما تحلّ استعلامات SQL محل أدوات binutils. الشيفرة متاحة على GitHub في مستودع selfdb.
ELF قاعدة بيانات بالفعل
حجّة زكريا أن ELF هو أصلاً قاعدة بيانات، لكنها منفّذة يدوياً: جداول النصوص هي عملية إدماج نصوص، و.gnu.hash فهرس مبني يدوياً، وجدول ترويسات الأقسام جدول للجداول، والإزاحات داخل جدول النصوص تؤدي دور المفاتيح الأجنبية. الصيغة مضغوطة، ولا تملك مخططاً يصف نفسها، وكل أداة تقرأها تعيد كتابة المحلّل نفسه من جديد. أداته السابقة، sqlelf، عرضت ملفات ELF كجداول SQL افتراضية ليتمكن المطوّرون من كتابة SELECT بدل الجمع بين readelf وgrep.
ما يحتويه ملف SELF
يكفي جدولان للتنفيذ: self_meta يخزّن ترويسة ELF كأزواج مفتاح-قيمة، أما segments فيحتفظ بصفّ لكل ترويسة برنامج مع بايتات المقطع في عمود BLOB. ويحلّ جدول symbols واحد بفهرس b-tree واحد محل عدة أقسام في ELF وبنية .gnu.hash اليدوية، بينما تصبح إصدارات الرموز عموداً عادياً. أما جداول sections وnotes وdynamic_entries فموجودة للأدوات فقط: حذفها يترك برنامجاً قابلاً للتشغيل، أي إن strip هو DELETE يليه VACUUM، وpatchelf هو UPDATE، وldd عرض فوق JOIN.
كيف تشغّله النواة
تحفظ SQLite حقلاً من أربعة بايتات باسم application_id عند الإزاحة 68 من ترويستها؛ ويكتب SELF فيه الأحرف SELF حتى لا تتطابق قاعدة بيانات عادية أبداً. ويوجّه التسجيل عبر binfmt_misc في لينكس النواة إلى تمرير الملف إلى مفسّر صغير يدعى self-exec يضع المقاطع القابلة للتحميل في الذاكرة وينفّذ الإزاحات ثم يقفز إلى نقطة الدخول. ويجب أن يبقى المفسّر نفسه ملف ELF، لأن مفسّراً يتطابق مع البايتات السحرية أيضاً سيُستدعى بشكل متكرر حتى تُرجع النواة الخطأ ELOOP.
الكلفة وبيئة مستخدم كاملة في ملف واحد
جرّب الربط الديناميكي بطريقتين: أولاً أُبقي ld.so في مكانه وأُجيب عن البحث عن المكتبات باستعلامات SQL عبر واجهة rtld-audit في glibc، ثم بُني رابط نموذجي ينفّذ الربط كله في SQL. من حيث الحجم، ملف SELF يقارب ضعف حجم ملف ELF المكافئ، لكن معظم هذه الزيادة بيانات أدوات اختيارية: بعد التصفية قاس ملف coreutils نحو 1,794,048 بايت مقابل 1,768,632 لنسخة ELF، أي في حدود واحد بالمئة. ويضيف التشغيل نحو 5 ميلي ثانية ثابتة ونسخاً يتناسب مع حجم الصورة؛ ولأن البايتات تُنسخ من شجرة b-tree بدل تعيينها في الذاكرة، لا تتشارك عمليتان للبرنامج نفسه صفحات النص.
أنتج حزم بيئة مستخدم كاملة في قاعدة واحدة النتيجة الأبرز: 723 ملفاً تنفيذياً تستدعي 400 مكتبة مشتركة أصبحت 1123 كائناً و346,386 رمزاً في ملف واحد بحجم 611.9 مبيبايت، وهو أصغر من 644.4 مبيبايت من ملفات ELF التي بُني منها. ويتحول LD_PRELOAD إلى صفّ في جدول، لذا فإن تفعيله وتعطيله معاملة واحدة.
SiTech — تطوير ويب مدعوم بالذكاء الاصطناعي
نبني مواقع سريعة وعصرية وندمج الذكاء الاصطناعي في سير عمل الشركات. لديك مشروع أو سؤال؟ يسعدنا مساعدتك.