חזרה
אב-טיפוס הופך את קובץ ההרצה למסד נתונים של SQLite
SiTech AI Team3 წთ. საკითხავი

אב-טיפוס הופך את קובץ ההרצה למסד נתונים של SQLite

המפתח פאריד זכריא בנה את SELF, אב-טיפוס לפורמט המאחסן תוכנה והספריות שלה במסד נתונים אחד של SQLite, ומחליף כלים כמו readelf, ldd ואפילו strip בשאילתות SQL פשוטות.

המפתח פאריד זכריא פרסם אב-טיפוס שמחליף את פורמט הקבצים הבינאריים ELF במסד נתונים של SQLite. שם הפרויקט הוא SELF — Structured Executable & Linkable Format: הפלט הוא קובץ 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 הוא view מעל JOIN.

איך הליבה מריצה אותו

SQLite שומרת שדה application_id באורך ארבעה בייטים בהיסט 68 בכותרת שלה; SELF חותם בו את האותיות SELF כך שמסד נתונים רגיל לעולם לא יתאים. רישום דרך binfmt_misc בלינוקס מורה לליבה להעביר את הקובץ למפרש קטן בשם self-exec, שממפה את הקטעים הניתנים לטעינה, מבצע רילוקציות וקופץ לנקודת הכניסה. המפרש עצמו חייב להישאר קובץ ELF, שכן מפרש שגם היה תואם לקסם היה נקרא רקורסיבית עד שהליבה מחזירה ELOOP.

עלות, ו-userland שלם בקובץ אחד

קישור דינמי נבחן בשתי דרכים: תחילה הושארה ld.so במקומה ושאילתות SQL דרך ממשק rtld-audit של glibc ענו על חיפוש ספריות, ואחר כך נבנה אב-טיפוס של מקשר שמבצע את כל הקישור ב-SQL. מבחינת גודל, קובץ SELF גדול בערך פי שניים מה-ELF המקביל, אך רוב התוספת היא נתוני כלים אופציונליים: לאחר ניקוי, קובץ coreutils מדד 1,794,048 בייט מול 1,768,632 בגרסת ELF — בתוך אחוז אחד. ההרצה מוסיפה כ-5 מ״ש קבועים ועותק ביחס לגודל התמונה; כיוון שהבייטים מועתקים מה-b-tree ולא ממופים לזיכרון, שני תהליכים של אותה תוכנה אינם חולקים דפי טקסט.

אריזת userland שלם במסד נתונים אחד הניבה את התוצאה הבולטת ביותר: 723 קבצים הרצים שמושכים 400 ספריות שונות הפכו ל-1,123 אובייקטים ו-346,386 סמלים בקובץ אחד בגודל 611.9 מי״ב — קטן מ-644.4 המי״ב של קבצי ה-ELF שמהם נבנה. ‏LD_PRELOAD הופך לשורה בטבלה, כך שהפעלתו וכיבויו הם טרנזקציה.

SSiTech

SiTech — פיתוח אתרים בכוח ה-AI

אנחנו בונים אתרים מהירים ומודרניים ומשלבים AI בתהליכי עבודה אמיתיים. יש לכם פרויקט או שאלה? נשמח לעזור.