Linux için Lotus 1-2-3
(lock.cmpxchg8b.com)- 30 yıllık tescilli elektronik tablo yazılımı Lotus 1-2-3, tesadüfen kurtarılan materyaller ve ikili dosya hack’leriyle, piyasaya çıktığı dönemde var olmayan Linux üzerinde yerel olarak çalıştırıldı
- 1990’ların BBS yedeklerinde kaybolduğu sanılan LPL eklenti SDK’sı ve UNIX için Lotus 1-2-3 bulununca, örnek eklentilerin derlenmesi ve UNIX ikili dosyalarının analizi mümkün oldu
- UNIX dağıtımında sıkıştırılmış Intel 80386 COFF nesnesi
123.oyer alıyordu; yaklaşık 20.000 sembol ve hata ayıklama bilgisi iç yapıyı ortaya çıkardı - Portlama yalnızca COFF’u ELF’e çevirmekle bitmedi; Linux ile UNIX arasındaki sistem çağrısı ve yapı ABI farklarını
coffsyrupve sarmalayıcı işlevlerle aşmak gerekti - Mevcut port çökmeden çalışıyor ve %100 kullanılabilir, ancak bazı sorunlar ve terminal sürücüsü portlaması hâlâ durduğu için DOS emülasyon sürümü şimdilik daha iyi görünüyor
30 yıllık tescilli bir uygulamayı Linux’a taşımanın başlangıç noktası
- Lotus 1-2-3, 30 yıllık abandonware olarak kalmıştı; ancak çeşitli keşifler ve hack’ler sayesinde Linux yerel portu mümkün hale geldi
- Portlama hedefi klasik Lotus 1-2-3 R3 idi; Lotus 1-2-3’ün kendisi ise 2002’ye kadar sürümler aldı
- Bu proje, modern sistemlerde Lotus 1-2-3’ün düzgün çalışmasını sağlayan lotusdrv sürücüsünü sürdürme çalışmasından doğdu
- Sürücü API’si tersine mühendislikle anlaşıldı ve mevcut sürücü modern sistemlerde iyi çalışıyor
Kayıp LPL SDK’sı ve BBS yedeği
- Lotus 1-2-3, eklentiler yani add-in’ler ile genişletilecek şekilde tasarlanmıştı; ancak eklentilerin LPL adlı özel bir dille yazılması gerekiyordu
- LPL derleyicisi ve SDK kaybolmuş durumdaydı; Lotus ise SDK’yı ücretsiz dağıtmıyor, 395 dolara satıyordu
- 1990’ların BBS sistemine ait teyp yedeklerini saklayan eski bir sysop aracılığıyla SDK’nın warez biçimindeki kopyası kurtarıldı
- Kurtarılan ADK 123DADK.ZIP olarak indirilebilir
- Örnek LPL programı modern.pl olarak yayımlandı
- Aynı BBS yedeğinde, yaygın olarak kaybolduğu düşünülen UNIX için Lotus 1-2-3’ün warez kopyası da vardı
UNIX için Lotus 1-2-3 disk imajlarının analizi
- UNIX sürümü,
123UNIX1.TD0ile123UNIX5.TD0arasındaki TD0 dosyaları kümesi olarak kalmıştı - TD0’nun 1980’lerden kalma eski bir sıkıştırılmış disk imajı biçimi olduğu anlaşıldı ve samdisk kullanılarak ham disk imajına dönüştürüldü
- Dönüştürülen imajlardan ilki
tar archive, diğerleri ise pre-SVR4 ya da odc biçiminde ASCII cpio archive idi - Tüm disk imajları Internet Archive’a yüklendi
- Arşiv açıldığında
lotus/123.v10altında yürütülebilir dosyalar, yardım dosyaları, tuş haritaları, yazıcı ve video sürücüsü verileri, örnek dosyalar, kılavuzlar vb. ortaya çıktı- Toplam yapı 35 dizin ve 338 dosya düzeyindeydi
Kritik ipucu: 123.o
sysV386/libdizininde123.o.z_1ve123.o.z_2olarak ikiye bölünmüş büyük bir dosya bulundu- İki parça birleştirilip sıkıştırma açılınca
123.odosyasının Intel 80386 COFF object file olduğu anlaşıldı- stripped edilmemiş nesne dosyası
- 5 bölüm
- sembol ofseti
0x1efbdc -
19.755 sembol
- optional header size 28
- Bu dosya private symbol’lar ve hata ayıklama bilgisi içerdiği için Lotus 1-2-3’ün iç yapısını anlamada büyük yardım sağladı
alt.folklore.computersüzerinden gelen yanıt, bu dosyanın yanlışlıkla eklenmediği yönündeydi- 1990’ların başındaki UNIX’lerde
dlopen()yaygın kullanılmadığından, genişletmelerle yeniden linklemek için kullanılan partially linked object olma olasılığı yüksekti
Hata ayıklama bilgisinin ortaya çıkardığı iç yapı
- UNIX sürümü, DOS sürümünün doğrudan kaynak portuna yakın olduğu için büyük ölçüde aynı şekilde çalışıyordu
- İçindeki hata ayıklama bilgisi, Lotus 1-2-3’ün iç yapısına dair birçok soruyu çözdü
- Grafik çıktısını iyileştirmek için sürücüden rasterizer’a hook koymak isteniyordu; ancak yalnızca belgelerle işleyişi anlamak zordu
- Hata ayıklama bilgileri sayesinde rasterizer’ın küçük bir bytecode programını dinamik olarak oluşturduğu ve grafik motorunun bunu yorumladığı anlaşıldı
- Opcode’lar öğrenildikten sonra raster.c içinde bunları disassemble edip değiştirerek çıktı iyileştirmelerinde kullanmak mümkün oldu
COFF’tan ELF’e dönüştürme
objcopy, COFF nesne dosyasını Linux’un kullandığı ELF biçimine dönüştürebiliyorobjcopy -I coff-i386 -O elf32-i386 123.o 123elf.okomutuyla123.o,123elf.odosyasına dönüştürüldü- Dönüştürme sonucu
ELF 32-bit LSB relocatable, Intel 803386, version 1 (SYSV), not strippedolarak doğrulandı objdump’a göre orijinal nesne dosyasının derlenme zamanı 8 Eylül 1990 06:23:50 idi; bu, Linux’un ilk sürümünün çıkmasından önceye denk geliyor
Linux ve UNIX ABI farklarını ele alma
- İlk sorun, Linux ile UNIX’in uyumlu sistem çağrısı arayüzü kullanmamasıydı
- UNIX sürümü
lcall7arayüzünü kullanıyordu; örneğinopen(),call 0x7:0x0biçimindeki bir callgate’i çağırıyordu - Linux’ta bu callgate desteklenmediğinden, olduğu gibi çalıştırılınca çökme meydana geliyordu
- Linux’ta bir dönem
lcall7velcall27uyumluluk desteği vardı, ancak artık yok
- Linux’ta bir dönem
- Hedef, bu çağrıları ortadan kaldırıp tüm çağrıları glibc üzerinden yönlendirmekti
Relocation ve coffsyrup
- Basitçe
objcopy --strip-symbol openile sembolü kaldırmaya çalışıldı, ancakopenrelocation içinde kullanıldığı içinobjcopybunu reddetti - Relocatable object file, hangi adrese yüklenirse yüklensin çalışabilmek için sembol referansları ve relocation bilgileri içerir
- Bir sembolü kaldırmak için o sembole referans veren relocation bilgilerini de birlikte değiştirmek gerekir
- Bunun için küçük bir araç olan coffsyrup yazıldı
objcopy’nin reddettiği COFF sembollerini de kaldırabiliyor- Örnek olarak
opensembolünü ve ilgili relocation’ları bulup işliyor
İkili uyumlu olmayan UNIX işlevleri
- Standart UNIX işlevlerinin önemli bir bölümü kaynak uyumlu olsa da ikili uyumlu değildir
- Tipik örnek
struct stattir- Aynı C kodu çeşitli UNIX türevlerinde derlenebilir
- Ancak derlenmiş nesne dosyası,
struct statboyutu ya dast_sizeofseti farkları nedeniyle başka sistemlerde bozulabilir
- Ele alınması gereken başlıca işlevler
stat(),times(),uname(),fcntl(),ioctl()vb. idi - Yaklaşım,
objcopyile sembol adlarını değiştirmek,coffsyrupile undefined hale getirmek ve Linux yapılarını UNIX yapılarına dönüştüren sarmalayıcı işlevler yazmaktı termiosözellikle büyük bir zorluktu; ayrıntılı davranışları UNIX sistemleri arasında ince farklar gösterdiği ve uyumsuz olduğu için hata ayıklaması zordu
Lisans kontrolü ve çalışma sonucu
- Çeşitli hack’lerden sonra program çökmeden çalıştı, ancak lisans yoksa çalışmıyordu
exit()üzerine breakpoint koyarak yapılan kontrolde, geçerli lisansı doğrulayan iç sembolünlic_init()olduğu anlaşıldı- IDA ile kod incelendiğinde lisans kontrolünün
LICENSE.000dosyasını aradığı; içindeki son kullanma tarihi, kullanıcı adı ve sistem adının sistemin bildirdiği değerlerle eşleşip eşleşmediğini kontrol ettiği görüldü - Sonuçta Lotus 1-2-3 yeni işletim sistemi Linux’a portlandı
- Mevcut durum şöyle
- Çökmeden çalışıyor
-
%100 kullanılabilir
- Bazı sorunların daha da iyileştirilmesi gerekiyor
- Terminal sürücüsü portlaması hâlâ duruyor
- Şimdilik emülasyonda çalışan DOS sürümü daha iyi görünüyor, ancak bu düzeltilebilir
- Portlama kodu github’da yayımlandı
1 yorum
Hacker News yorumları
Eski bir BBS sisteminin teyp yedeğinden SDK'nın warez kopyasını kurtarıp örnek eklentiyi bile derlemiş olmaları inanılmaz gibi
Why History Needs Software Piracy yazısını hatırlatıyor
Bu tür ekipmanlar onlarca yıl sonra bile varlığını sürdürecek donanımlar olduğundan, üretici bazında kişisel bulutta saklama seviyesinin ötesinde, tüm topluluğun kullanabileceği merkezi ve uzun ömürlü bir depo olmasının kamu yararı açısından değeri büyük
Arşivi her yıl dağıtmayı ya da yaklaşık 100 yıl dayanacak fiziksel medya olarak archival Blu-ray satmayı da düşünmüştüm
Böylece ARM tabanlı DSP Eurorack modülünün bozulmuş firmware'ini kurtarmak için gereken son nadir
.bindosyasının birilerinde bulunma olasılığı 1'e yaklaşırdıBabam, eski Windows yüklü yedek bir dizüstü bilgisayarda bir sürü önemli Lotus 1-2-3 dosyası tutuyordu; ara sıra açması gerektiği için bu durum epey endişe vericiydi
Yakın zamanda LibreOffice'in Lotus dosyalarını ODF/ODS'ye, hatta komut satırından bile dönüştürebildiğini öğrendim ve basit bir bash betiğiyle hepsini dönüştürdüm
Dönüştürülen dosyaları Collabora bağlı Nextcloud'a topluca yükleyip babama bir hesap ve kısa kullanım talimatı verdim; artık dosyaları çevrimiçi görebiliyor ve sunucunun normal yedekleme rutinine de dahil oluyorlar
OP gibi veri arkeologlarına ve LibreOffice katkıcılarına çok teşekkürler
7 yaşındayken Nintendo almaları için ısrar edince babamın onun yerine 286 PC ile Lotus 1-2-3 ve Indiana Jones metin macerası aldığını hatırladım
Böylece ilk dilim LISP değil BASIC oldu; hayattaki tüm başarısızlıklarımı bu trajediye bağlamayı düşünüyorum, itiraz kabul etmiyorum
Spectrum'un artık düşüş döneminde olduğu bir zamanda bile böyleydi
Benzer bir iş yapıyorum, ancak programın bazı kısımlarını önce nesne dosyalarına çevirme adımını ekliyorum
Böylece yalnızca elde kalmış mevcut nesne dosyalarına bağlı kalmıyorum, ama çalışır hale getirmek için bir miktar tersine mühendislik gerekiyor
Atari Jaguar linker'ı
alnile bir kavram kanıtı hazırladım; Linux x86a.outçalıştırılabilir dosyasını ELF nesne dosyalarına ayırıp ABI farklarını aşarak yeniden ELF x86 çalıştırılabilir dosyası olarak linkledimhttps://forums.atariage.com/topic/354341-porting-the-original-atari-jaguar-sdk-to-elf/
Birçok açıdan ilginçti
Kaynak kodu da, özgün derleyici ve dili de olmadan UNIX binary'sinden Linux binary'sine taşıma süreci harika görünüyordu; HN'e yakışan içerik tam da bu
2023'te bile Usenet'in yalnızca rar dosyası dağıtımı dışında amaçlarla kullanıldığını da hatırlatıyor
İnternetin kitleselleşmesinden önceki BBS kültürünün tutkuyu ve iyi shareware dağıtımını geniş kitlelere yaydığı geçmişi de akla getiriyor
Twitter ve diğer sosyal medyanın çöküş eğilimine bakınca bu daha da öyle; yaşça büyük Z kuşağı 80'ler ve 90'lar nostaljisine kapılıp modem el sıkışma seslerini zil sesi olarak indiriyor
23 yaşındaki yeğenim de yakın zamanda bunu yaptı; American Horror Story ve Stranger Things gibi yapımlar da bu nostaljiyi daha da besliyor
Yeterince uzun beklersen her şey yeniden moda olur diyen eski söz doğru çıkıyor
Geçen yıl, Mayıs 2022'de de iyi bir tartışma olmuştu
https://news.ycombinator.com/item?id=31455968
Bu harika yazıda bağlantısı verilen https://scenelist.org/ tam da bu sabah ihtiyacım olan nostalji bombasıydı
Anılara yolculuk için çok iyi, şiddetle tavsiye ederim
İlgili bağlantılar
Lotus 1-2-3 for Linux - https://news.ycombinator.com/item?id=35807639 - Mayıs 2023, 73 yorum
Lotus 1-2-3 - https://news.ycombinator.com/item?id=35872758 - Mayıs 2023, 117 yorum
Lotus 1-2-3 For Linux - https://news.ycombinator.com/item?id=31455968 - Mayıs 2022, 83 yorum
Lotus 1-2-3 arbitrary resolution - https://news.ycombinator.com/item?id=26316637 - Mart 2021, 123 yorum
Geçen yıl kısa süre kullanmış olmama rağmen 1-2-3'ü tamamen unutmuşum
Linux'ta
123binary'si hâlâ sorunsuz çalışıyor; uzun zaman önce ortadan kaybolmuş bir yazılımın öylece çalışması epey büyük bir başarıHep böyle bir şey istemiştim. Elektronik tablolarda yazı tipi ya da görselleri pek kullanmadığım için terminal tabanlı bir elektronik tablo tam bana göre
Sonunda çıkmış olmasına sevindim; Mac ve Windows'a da port edilse iyi olur
https://lock.cmpxchg8b.com/spreadsheet.html
Hiç kullanmadım ama bakmaya değer
Ayrıca Emacs'in Org-Mode'u sonu gelmeyecek kadar kurcalanabilecek bir araç; org-mode tablo hücrelerini Emacs
Calcözelliğiyle birlikte elektronik tablo gibi kullanmanın bir yolu da varhttps://www.youtube.com/watch?v=15aDIvb5LJs
Oldukça güçlü görünüyor ve Emacs'e yakışır şekilde hem terminalde hem de pencere ortamında çalışabiliyor
scvar: https://www.unix.com/man-page/linux/1/sc/