
Bir prototip, çalıştırılabilir dosya biçimini SQLite veritabanına dönüştürüyor
Geliştirici Farid Zakaria, bir programı ve kitaplıklarını tek bir SQLite veritabanında saklayan SELF adlı deneysel biçimi yayımladı; readelf ve ldd yerini SQL sorgularına bırakıyor.
Geliştirici Farid Zakaria, ELF ikili biçimini SQLite ile değiştiren bir prototip yayımladı. SELF — Structured Executable & Linkable Format — adlı proje, çalıştırma izni verilen ve gerçekten çalışan sıradan bir SQLite dosyası üretiyor; binutils araçlarının yerini SQL sorguları alıyor. Kod GitHub'daki selfdb deposunda.
ELF zaten bir veritabanı
Zakaria'ya göre ELF hâlihazırda bir veritabanıdır, yalnızca elle uygulanmıştır: dize tabloları dize internleme, .gnu.hash elle kurulmuş bir indeks, bölüm başlıkları tablosu bir tablolar tablosu, dize tablosuna yapılan atlamalar ise birer yabancı anahtardır. Biçim sıkışıktır, kendini tanımlayan bir şeması yoktur ve onu okuyan her araç aynı ayrıştırıcıyı yeniden yazar. Yazarın önceki aracı sqlelf, ELF dosyalarını SQL sanal tabloları olarak sunarak geliştiricilerin readelf ile grep birleştirmek yerine SELECT yazmasını sağladı.
Bir SELF dosyası ne içerir
Çalıştırmak için iki tablo yeterlidir: self_meta ELF başlığını anahtar-değer çiftleri olarak saklar, segments ise her program başlığı için bir satır ve segment baytlarını bir BLOB sütununda tutar. Tek bir b-tree indeksli symbols tablosu, ELF'in birkaç bölümünü ve elle kurulmuş .gnu.hash yapısını değiştirir; simge sürümleri de sıradan bir sütun olur. sections, notes ve dynamic_entries tabloları yalnızca araçlar içindir: silindiklerinde program yine çalışır, yani strip bir DELETE artı VACUUM, patchelf bir UPDATE, ldd ise bir JOIN üzerinde görünümdür.
Çekirdek onu nasıl çalıştırıyor
SQLite, başlığının 68. konumunda dört baytlık application_id alanı ayırır; SELF oraya SELF karakterlerini yazar, böylece sıradan bir veritabanı asla eşleşmez. Linux'taki binfmt_misc kaydı çekirdeğe dosyayı küçük bir yorumlayıcıya, self-exec'e iletmesini söyler; bu araç yüklenecek segmentleri eşler, yer değiştirmeleri yapar ve giriş noktasına atlar. Yorumlayıcının kendisi ELF kalmalıdır, çünkü aynı sihirli baytlarla eşleşen bir yorumlayıcı çekirdek ELOOP döndürene kadar yinelemeli olarak çağrılırdı.
Maliyet ve tek dosyada tüm userland
Dinamik bağlama iki kez denendi: önce ld.so yerinde bırakıldı ve kitaplık aramaları glibc'nin rtld-audit arayüzü üzerinden SQL ile yanıtlandı, ardından bağlamanın tamamını SQL'de yapan bir prototip bağlayıcı yazıldı. Boyut olarak SELF dosyası eşdeğer ELF'in yaklaşık iki katıdır, ancak bunun çoğu isteğe bağlı araç verisidir: temizlendiğinde bir coreutils ikilisi 1.794.048 bayt, ELF sürümü ise 1.768.632 bayt ölçüldü, yani yüzde bir içinde. Başlatma sabit yaklaşık 5 ms ile imaj boyutuyla orantılı bir kopyalama ekler; baytlar b-tree'den kopyalandığı ve belleğe eşlenmediği için aynı programın iki süreci metin sayfalarını paylaşmaz.
Tüm bir userland'ı tek veritabanına paketlemek en çarpıcı sonucu verdi: 400 farklı paylaşılan kitaplık çeken 723 çalıştırılabilir dosya, tek bir 611,9 MiB dosyada 1.123 nesne ve 346.386 simgeye dönüştü; bu, kaynak alınan 644,4 MiB ELF dosyasından daha küçük. LD_PRELOAD tablodaki bir satır hâline gelir, dolayısıyla açıp kapatmak bir işlemdir.
SiTech — AI destekli web geliştirme
Hızlı ve modern web siteleri kuruyor, AI'yı gerçek iş akışlarına taşıyoruz. Projeniz veya sorunuz mu var? Yardımcı olmaktan mutluluk duyarız.