- 13KiB boyutunda tek bir dosya olarak Windows, Linux ve tarayıcıda çalışan bir Snake oyunu; üç platformu da tek bir kaynak üzerinden destekliyor
- Yılanı kontrol edip yemi yiyerek duvarlara çarpmamaya dayanan klasik Snake kurallarını izliyor; puan, seviye ve labirent yapısı içeriyor
- Her platform için C (WinAPI/X11) ve JavaScript (HTML5 Canvas) ile uygulanmış; her biri yaklaşık 3~5KiB düzeyine sıkıştırılıp birleştirilmiş
- Windows tarafı alışılmadık bir PE başlığı ve apphelp mekanizmasını, Linux tarafı lzma sıkıştırma ve shell dropper'ı, tarayıcı tarafı ise HTML/CSS hilelerini kullanarak çalışıyor
- Üç uygulamanın birleştirilmesiyle 13.312 baytlık tek bir çalıştırılabilir dosya ortaya çıkıyor ve çok platformlu çalıştırılabilir dosya yapılarının deneysel potansiyelini gösteriyor
Cosmopolitan libc'den esinlenen çok platformlu deneme
- Cosmopolitan libc, C kaynak kodunu birden fazla işletim sisteminde çalışabilen tek bir ikiliye derleyebilen bir araç takımı
- Windows, Linux, BSD gibi çeşitli işletim sistemlerinde yerel çalıştırmayı destekliyor
- GUI desteğinin olmaması ve büyük ikili boyutu sınırlaması nedeniyle, yazar 16KiB'nin altında bir video oyunu yapma meydan okumasını seçmiş
- Hedef, Windows, Linux ve tarayıcıda çalışan, tek kaynak tabanlı bir oyun geliştirmek
Oyun yapısı ve kuralları
- Oyun, yön tuşları veya WASD ile kontrol edilen standart bir Snake oyunu
ESC ile çıkış, R ile sıfırlama, P ile duraklatma, boşluk tuşu ile başlatma
- Her yem yendiğinde puan artıyor; normal yem 10 puan, sarı yem (%15 olasılık) ise 20 puan veriyor
- Yemler belirli bir süreden sonra kayboluyor ve kaybolma süresi yılanın hızına (uzunluğuyla orantılı) göre belirleniyor
- 10 yem yenince bir sonraki seviyeye geçiliyor ve duvar yerleşimi rastgele değişiyor
- Labirent, yeme giden bir yol her zaman bulunacak şekilde oluşturuluyor
- Yılanın başlangıç konumu da rastgele, ancak en az 5 karelik boş alan sağlayan bir yöne yerleştiriliyor
- Tamamlanan oyun dosyasının boyutu 13.772 bayt
Üç platform için uygulama yöntemi
- Windows sürümü, WinAPI tabanlı C koduyla yazılmış ve sıkıştırma betiği ile açıcı stub içeriyor
- PE başlığındaki
MZ imzasından sonra serbestçe kontrol edilebilen baytlar kullanılarak bir shell betiği gömülüyor
- Bu sayede dosya hem bir Windows çalıştırılabilir dosyası hem de aynı anda geçerli bir Linux shell betiği oluyor
- İlk çalıştırmada “The application was unable to start correctly (0xc0000005)” hatası görülebilir, ancak yeniden çalıştırıldığında normal biçimde çalışıyor
- Linux sürümü,
lzma sıkıştırması kullanıyor ve küçük bir shell dropper sıkıştırılmış ELF64 ikilisini çıkarıp çalıştırıyor
- Dosyanın başındaki ve sonundaki bazı bölümleri atlayarak çalışacak şekilde yapılandırılmış
- HTML sürümü, tarayıcının dosyanın gereksiz ön kısmını yok sayıp HTML'i işlemesi özelliğinden yararlanıyor
- CSS ile gereksiz verilerin ekranda görünmemesi sağlanıyor
Tek dosyada birleştirme ve yapı
- Üç platforma ait dosyalar belirli bir sırayla birleştirilerek (concatenate) her ortamın yalnızca kendisine uygun kısmı çalıştırması sağlanıyor
- Windows PE bölümünü, Linux ELF bölümünü, tarayıcı ise HTML bölümünü tanıyor
- Son dosya boyutu 13.312 bayt ve üç ortamda da çalışabilen bir polyglot ikili elde ediliyor
- Dosyanın içinde Windows PE başlığı, Linux için LZMA sıkıştırılmış kod ve HTML/CSS/JavaScript kodu art arda yer alıyor
- Örnek kod bloklarında
MZ imzası, ks işaretçisi, <html> etiketi ve <script> bloğu gibi parçalar sırasıyla bulunuyor
Teknik önemi
- Tek dosyayla Windows, Linux ve tarayıcıyı aynı anda destekleyen bir çalıştırma yapısı hayata geçiriliyor
- PE, ELF ve HTML biçimlerinin iç içe kullanımı ile platforma göre yürütme yolu ayrıştırılıyor
- 13KiB gibi son derece küçük bir boyutta sıkıştırma, biçim hack'leri ve çok platformlu çalıştırma bir araya getirilerek deneysel bir başarı elde ediliyor
1 yorum
Hacker News yorumları
Linux çalıştırılabilir dosyasını çıkardım ve readelf ile objdump'ın onu düzgün okuyamamasına şaşırdım
İnceleyince, yer kazanmak için PT_DYNAMIC başlığının kullanılmayan alanlarına dinamik bağlayıcının adının zorla yerleştirildiğini gördüm
Ama böyle bir formatı bilerek bozmanın anlamsız bir tasarruf olduğunu düşünüyorum
Antivirüs ya da DEP gibi güvenlik özellikleriyle çakışabilir, bu yüzden böyle çalıştırılabilir dosyalarla uğraşmak istemem
Orijinal Zelda oyununun dosya boyutunun bu kadar küçük olmasına şaşırdım
Bu kadar az kod ve veriyle ne kadar büyük bir duygu ve sürükleyicilik yaratabildiklerine hayran kaldım
The Legend of Zelda (Wikipedia)
40 yıl sonra haritayı çıkardım ve sadece PNG olarak bile 800KB'ı aşıyor
Oyun haritasını görüntüle
Tasarımcılar bunu alan kısıtları içinde bir bulmaca gibi kurgulamıştı
Zelda harita yapısı için bkz.
Test sonuçlarım
.htmlyapınca çalışıyorlzmakomutu yok hatası verdi,xzpaketini kurunca çalıştı.comya da.exeolarak çalıştırınca hata (0xc0000005) aldım, DEP ayarını kapatınca çalıştıchmod +x snake.comyapıp çalıştırınca Mono deniyor ve başarısız oluyorBunun yerine
bash snake.comile çalıştırınca sorunsuz çalışıyor. Debian 13 üzerinde denedimİlginç olan, bu dosyanın bir araya getirilmiş üç çalıştırılabilir dosya olması
Bu yüzden her platformda tamamen farklı bir program da içerebilir
Bu bana 96KB'lık FPS oyunu kkrieger'i hatırlattı
O dönem için grafik seviyesi şaşırtıcıydı
kkrieger (arşiv)
Mac'te tarayıcı dışında bunu çalıştırmanın bir yolu olup olmadığını merak ediyorum
cannot execute binary filehatası alıyorumBu mekanizmanın geliştirilip gerçek bir evrensel çalıştırılabilir dosya (universal binary) yapılıp yapılamayacağını merak ediyorum
Örneğin kodu Haxe ile yazıp C++'a derleyerek Win32 ve Linux sürümleri üretmek,
JavaScript'e dönüştürüp HTML içinde de çalıştırılabilir hâle getirmek,
sonra bu üç çıktıyı tek bir dosyada birleştirmek mümkün olabilir gibi görünüyor
Tek bir dosyayla her yerde çalışabilen tek dosyalı uygulama fikrini seviyorum
Ben de sunucusuz bir platform geliştirirken bu yönde araştırma yapıyorum
Veri odaklı uygulamaları tek bir
.htmldosyasıyla oluşturup web-components'ları uzaktan yükleyen bir yapı kuruyorumHTML'i doğrudan
file://protokolüyle açabilmek çok güçlü bir özellik ama sık sık göz ardı ediliyorYani sadece bir tarayıcı örneği açmamış, iki tam yerel uygulama da yapmış
Polyglot dosyaların bu kadar geç ortaya çıkmış olması ilginç
Teknik olarak bunun 10-20 yıl önce de mümkün olması gerekirdi gibi geliyor
EICAR.COM hem metin hem çalıştırılabilir dosya olan erken bir örnek olarak aklıma geliyor
js13kGames gibi ultra küçük web oyunu yarışmalarını hatırlattı