Linux के लिए Lotus 1-2-3
(lock.cmpxchg8b.com)- 30 साल पुराना proprietary spreadsheet Lotus 1-2-3 संयोग से रिकवर हुए data और binary hacking के बाद, उस Linux पर native रूप से चल पाया जो release के समय मौजूद भी नहीं था
- 1990s के BBS backup में खोया हुआ माना जा रहा LPL add-in SDK और Lotus 1-2-3 for UNIX मिलने से sample plugin build और UNIX binary analysis संभव हुआ
- UNIX distribution में compressed Intel 80386 COFF object
123.oशामिल था, और करीब 20,000 symbols व debug information ने इसकी internal structure उजागर की - Porting सिर्फ COFF को ELF में बदलने भर से पूरी नहीं हुई; Linux और UNIX के system call और structure ABI differences को
coffsyrupऔर wrapper functions से bypass करना पड़ा - मौजूदा port बिना crash के चलता है और 100% usable है, लेकिन कुछ issues और terminal driver porting अभी बाकी हैं, इसलिए DOS emulation version फिलहाल देखने में बेहतर है
30 साल पुराने proprietary app को Linux पर लाने की शुरुआत
- Lotus 1-2-3 30 साल पुराने abandonware के रूप में बचा हुआ था, लेकिन कई discoveries और hacking के जरिए Linux native port संभव हुआ
- Porting target classic Lotus 1-2-3 R3 है, जबकि Lotus 1-2-3 के releases खुद 2002 तक आते रहे थे
- यह project modern systems पर Lotus 1-2-3 को ठीक से चलाने वाले lotusdrv driver maintenance work से शुरू हुआ
- Driver API को reverse engineering से समझा गया, और existing drivers modern systems पर अच्छी तरह चलते हैं
खोया हुआ LPL SDK और BBS backup
- Lotus 1-2-3 को plugins, यानी add-ins के जरिए extend करने के लिए design किया गया था, लेकिन add-ins को LPL नाम की special language में लिखना पड़ता था
- LPL compiler और SDK गायब थे, और Lotus SDK को free में distribute नहीं करता था बल्कि 395 dollars में बेचता था
- 1990s के BBS system के tape backups संभालकर रखने वाले एक पूर्व sysop के जरिए warez form में SDK recover हुआ
- रिकवर किया गया ADK 123DADK.ZIP के रूप में download किया जा सकता है
- Sample LPL program modern.pl के रूप में public है
- उसी BBS backup में Lotus 1-2-3 for UNIX की warez copy भी थी, जिसे व्यापक रूप से खोया हुआ माना जाता था
Lotus 1-2-3 for UNIX disk image analysis
- UNIX version
123UNIX1.TD0से123UNIX5.TD0तक के TD0 files के bundle के रूप में बचा हुआ था - TD0 को 1980s का पुराना compressed disk image format पाया गया, और samdisk का उपयोग करके raw disk images में convert किया गया
- Converted images में पहला
tar archiveथा, बाकी pre-SVR4 या odc format के ASCII cpio archive थे - पूरे disk images Internet Archive पर upload किए गए
- Extract करने पर
lotus/123.v10के नीचे executables, help, keymaps, printer और video driver data, sample files, manuals आदि मिले- कुल structure लगभग 35 directories और 338 files का था
निर्णायक clue बना 123.o
sysV386/libdirectory में123.o.z_1और123.o.z_2में बंटा एक बड़ा file मिला- दोनों pieces जोड़कर decompress करने पर
123.oएक Intel 80386 COFF object file निकला- Unstripped object file
- 5 sections
- Symbol offset
0x1efbdc -
19,755 symbols
- optional header size 28
- इस file में private symbols और debug information शामिल थे, जिससे Lotus 1-2-3 की internal structure समझने में बहुत मदद मिली
alt.folklore.computersसे मिली response इस ओर थी कि यह file गलती से शामिल नहीं हुई थी- शुरुआती 1990s के UNIX में
dlopen()widely used नहीं था, इसलिए यह extensions के साथ relink करने के लिए partially linked object होने की संभावना ज्यादा थी
Debug information से सामने आई internal structure
- UNIX version, DOS version के direct source port के करीब था, इसलिए ज्यादातर उसी तरह काम करता था
- शामिल debug information ने Lotus 1-2-3 internals से जुड़े कई सवाल हल कर दिए
- Graph output सुधारने के लिए driver से rasterizer में hook लगाना था, लेकिन सिर्फ documentation से behavior समझना मुश्किल था
- Debug information से पता चला कि rasterizer छोटे bytecode programs dynamically generate करता है, और graphics engine उन्हें interpret करता है
- opcode समझने के बाद raster.c में इसे disassemble और modify करके output improvement में इस्तेमाल करना संभव हुआ
COFF से ELF में conversion
objcopyCOFF object file को Linux में इस्तेमाल होने वाले ELF format में convert कर सकता हैobjcopy -I coff-i386 -O elf32-i386 123.o 123elf.ocommand से123.oको123elf.oमें convert किया गया- Conversion result
ELF 32-bit LSB relocatable, Intel 803386, version 1 (SYSV), not strippedके रूप में confirm हुआ objdumpके अनुसार original object file का compile time 8 सितंबर 1990 06:23:50 था, यानी Linux के पहले version के आने से पहले
Linux और UNIX ABI differences संभालना
- पहली समस्या यह थी कि Linux और UNIX compatible system call interface इस्तेमाल नहीं करते
- UNIX version
lcall7interface इस्तेमाल करता था; उदाहरण के लिएopen()call 0x7:0x0form के callgate को call करता है - Linux में यह callgate supported नहीं है, इसलिए वैसे ही चलाने पर crash होता है
- Linux में कभी
lcall7औरlcall27compatibility support था, लेकिन अब नहीं है
- Linux में कभी
- लक्ष्य था ऐसे calls हटाना और सभी calls को glibc के जरिए route करना
Relocation और coffsyrup
- सिर्फ
objcopy --strip-symbol openसे symbol हटाने की कोशिश की गई, लेकिनopenrelocation में इस्तेमाल हो रहा था, इसलिएobjcopyने मना कर दिया - Relocatable object file में symbols references और relocation information होती है ताकि वह किसी भी address पर load होकर काम कर सके
- Symbol हटाने के लिए उस symbol को reference करने वाली relocation information भी साथ में modify करनी होती है
- इसके लिए छोटा tool coffsyrup लिखा गया
- यह
objcopyद्वारा reject किए जाने वाले COFF symbols भी हटा सकता है - उदाहरण के तौर पर
opensymbol और उससे जुड़ी relocations को ढूंढकर process किया गया
- यह
Binary-compatible न होने वाले UNIX functions
- Standard UNIX functions में से कई source-compatible तो हैं, लेकिन binary-compatible नहीं
- इसका प्रमुख example
struct statहै- वही C code कई UNIX variants पर compile हो सकता है
- लेकिन compiled object file,
struct statके size याst_sizeoffset में differences की वजह से दूसरे system पर टूट सकता है
- जिन मुख्य functions को handle करना था वे
stat(),times(),uname(),fcntl(),ioctl()आदि हैं - Approach यह थी कि
objcopyसे symbol names बदले जाएं,coffsyrupसे उन्हें undefined किया जाए, और Linux structures को UNIX structures में convert करने वाले wrapper functions लिखे जाएं termiosखास तौर पर बड़ी मुश्किल था, और इसकी detailed behavior UNIX systems के बीच subtle और incompatible तरीके से अलग होती है, इसलिए debugging कठिन थी
License check और execution result
- कई hacks के बाद program बिना crash के चलने लगा, लेकिन license न होने पर काम नहीं करता था
exit()पर break लगाकर जांचने पर पता चला कि valid license verify करने वाला internal symbollic_init()था- IDA से code देखने पर पता चला कि license check
LICENSE.000file खोजता है और उसमें expiry date, user name, system name को system-reported values से match करता है - अंततः Lotus 1-2-3 को नए operating system Linux पर port कर दिया गया
- मौजूदा status इस प्रकार है
- बिना crash के चलता है
-
100% usable
- कुछ issues को और polish करना बाकी है
- Terminal driver porting बाकी है
- फिलहाल emulation में चलने वाला DOS version देखने में बेहतर है, लेकिन इसे fix किया जा सकता है
- Porting code github पर public है
1 टिप्पणियां
Hacker News की राय
पुराने BBS सिस्टम के tape backup से SDK की warez copy रिकवर करके sample plugin तक build कर लिया—यह लगभग अविश्वसनीय है
Why History Needs Software Piracy याद आ गया
ऐसा gear कई दशकों बाद भी मौजूद रहने वाला hardware है, इसलिए हर manufacturer के हिसाब से किसी personal cloud में रखने के स्तर से आगे बढ़कर, पूरी community के इस्तेमाल लायक एक centralized और लंबे समय तक टिकने वाली repository हो तो उसका public-interest value बहुत बड़ा होगा
हर साल archive distribute करने या लगभग 100 साल टिकने वाले physical media के रूप में archival Blu-ray बेचने का तरीका भी सोचा था
तब किसी ARM-based DSP Eurorack module के corrupted firmware को बचाने के लिए जरूरी आखिरी rare
.binfile किसी न किसी के पास होने की संभावना लगभग 1 हो जाएगीमेरे पिता ने पुराने Windows वाले secondary laptop में बहुत सारी महत्वपूर्ण Lotus 1-2-3 files रखी हुई थीं, और कभी-कभी उन्हें खोलना पड़ता था, इसलिए वह स्थिति काफी असुरक्षित लगती थी
हाल ही में पता चला कि LibreOffice Lotus files को ODF/ODS में, यहां तक कि command line से भी, convert कर सकता है; फिर एक simple bash script से सब convert कर दिया
converted files को Collabora लगे Nextcloud पर bulk में upload किया और पिता को account व basic usage बता दिया; अब वे files online देख सकते हैं और वे server के regular backup routine में भी शामिल हैं
OP जैसे data archaeologists और LibreOffice contributors का बहुत आभार
याद आया, जब मैं 7 साल का था और Nintendo मांग रहा था, तो पिता ने उसकी जगह 286 PC, Lotus 1-2-3 और Indiana Jones text adventure खरीदकर दे दिया था
इसलिए मेरी पहली language LISP नहीं बल्कि BASIC बनी, और मैं जीवन की हर नाकामी का दोष इसी tragedy पर डालने वाला हूं; कोई आपत्ति स्वीकार नहीं
भले ही उस समय Spectrum का दौर पहले से ढलान पर था
मैं भी मिलता-जुलता काम कर रहा हूं, लेकिन program के कुछ हिस्सों को पहले object files में बदलने का step जोड़ रहा हूं
इसलिए यह केवल बचे हुए existing object files तक सीमित नहीं रहता, लेकिन इसे चलाने लायक बनाने के लिए कुछ reverse engineering चाहिए
Atari Jaguar linker
alnके साथ proof of concept बनाया, और Linux x86a.outexecutable को ELF object files में अलग करने के बाद ABI differences को bypass करके उसे फिर से ELF x86 executable के रूप में link कियाhttps://forums.atariage.com/topic/354341-porting-the-original-atari-jaguar-sdk-to-elf/
कई मायनों में दिलचस्प था
source code, original compiler और language के बिना UNIX binary से Linux binary में port करने की प्रक्रिया शानदार लगी, और ऐसी चीजें ही HN जैसी लगती हैं
यह भी याद दिलाया कि 2023 में भी Usenet सिर्फ rar files distribute करने के अलावा दूसरे कामों में इस्तेमाल होता है
Internet mainstream होने से पहले की BBS culture भी याद आ गई, जिसने जुनून और बेहतरीन shareware distribution को आम लोगों तक पहुंचाया था
Twitter सहित social media के टूटने-बिखरने के trend को देखें तो और भी ऐसा लगता है; उम्र में बड़े Gen Z लोग 80s–90s retro में डूबे हैं और modem negotiation sound को ringtone के तौर पर download भी करते हैं
मेरे 23 साल के भतीजे ने भी हाल ही में ऐसा किया, और American Horror Story या Stranger Things जैसे shows उस nostalgia को और fuel कर रहे हैं
पुरानी कहावत सही ही है कि पर्याप्त देर इंतजार करो तो हर चीज फिर fashion में आ जाती है
पिछले साल मई 2022 में भी अच्छी discussion हुई थी
https://news.ycombinator.com/item?id=31455968
इस शानदार लेख में link किया गया https://scenelist.org/ आज सुबह मेरे लिए ठीक वैसा ही nostalgia bomb था जिसकी जरूरत थी
memories की यात्रा के लिए बहुत बढ़िया है और strongly recommend करता हूं
संबंधित links
Lotus 1-2-3 for Linux - https://news.ycombinator.com/item?id=35807639 - मई 2023, 73 comments
Lotus 1-2-3 - https://news.ycombinator.com/item?id=35872758 - मई 2023, 117 comments
Lotus 1-2-3 For Linux - https://news.ycombinator.com/item?id=31455968 - मई 2022, 83 comments
Lotus 1-2-3 arbitrary resolution - https://news.ycombinator.com/item?id=26316637 - मार्च 2021, 123 comments
पिछले साल थोड़ी देर इस्तेमाल करने के कारण मैं 1-2-3 को पूरी तरह भूल गया था
Linux पर
123binary अभी भी ठीक चल रही है, और बहुत पहले गायब हो चुके software का बस यूं ही काम कर जाना काफी बड़ी उपलब्धि हैमैं हमेशा ऐसी चीज चाहता था। spreadsheets में fonts या drawings ज्यादा इस्तेमाल नहीं करता, इसलिए terminal-based spreadsheet बिल्कुल सही बैठती है
आखिरकार यह आ गई, यह देखकर खुशी है; उम्मीद है Mac और Windows पर भी port होगी
https://lock.cmpxchg8b.com/spreadsheet.html
मैंने इस्तेमाल नहीं किया है, लेकिन देखने लायक है
साथ ही Emacs का Org-Mode अंतहीन तरीके से explore करने लायक tool है, और org-mode table cells को Emacs
Calcfeature के साथ spreadsheet की तरह इस्तेमाल करने का तरीका भी हैhttps://www.youtube.com/watch?v=15aDIvb5LJs
काफी powerful लगता है, और Emacs की तरह terminal और window environment दोनों में चल सकता है
scपहले से मौजूद है: https://www.unix.com/man-page/linux/1/sc/