- สรุปกระบวนการพอร์ต Lotus เวอร์ชัน Unix ที่มีอายุ 30 ปีมาลงบน Linux
ภูมิหลัง
- ผู้เขียนเป็นแฟนของ Lotus จึงรีเวิร์สเอนจิเนียร์เวอร์ชัน DOS เดิมและสร้างไดรเวอร์แสดงผลสำหรับ DosEmu เพื่อให้รันได้
- แต่ Add-in ของ Lotus รุ่นเก่านั้นใช้ไม่ได้
ซึ่งถูกพัฒนาด้วยภาษาพิเศษชื่อ LPL และไม่มีคอมไพเลอร์/SDK
→ ในยุคนั้นมันเป็นผลิตภัณฑ์แบบเสียเงินราคา $395 และหาใครที่มีอยู่ไม่ได้
- ต่อมาจึงได้สำเนา Warez ของ SDK มาจากเทปแบ็กอัปผ่าน SYSOP ที่เคยดูแล BBS ในยุค 90
→ ADK(Add-in Development Kit) for Lotus 1-2-3
- ใน BBS นั้นยังมีเวอร์ชัน Warez ของ Lotus 1-2-3 for Unix อยู่ด้วย
→ เป็นผลิตภัณฑ์ที่ถูกลืมไป เพราะขายได้ไม่มากจากการแข่งขันกับ SCO Professional ซึ่งเป็นคู่แข่งสายออฟฟิศบน Unix ที่มีชื่อเสียง
Lotus 1-2-3 for Unix
- อยู่ในรูปแบบไฟล์อิมเมจดิสก์บีบอัดชื่อ TD0 ซึ่งใช้กันในยุค 80
- แปลงเป็น raw disk image ด้วย
samdisk
- พบว่าในข้อมูลบนดิสก์มี object file ที่รวมสัญลักษณ์ของ 1-2-3 อยู่
→ มีการอธิบายว่าในช่วงต้นยุค 90 dlopen() ยังไม่ได้ถูกใช้อย่างแพร่หลาย จึงจำเป็นต้องใช้วิธีแบบนี้
การแฮ็ก
- object file นี้ช่วยไขข้อสงสัยหลายอย่างที่ผู้เขียนมีเกี่ยวกับโครงสร้างภายในของ Lotus 1-2-3
- ทำให้ไดรเวอร์ที่กำลังสร้างอยู่สามารถทำงานได้มากขึ้น
GNU objcopy
- ตอนที่ object file นี้ถูกคอมไพล์ Linux เวอร์ชันแรกยังไม่ถูกปล่อยออกมาด้วยซ้ำ
- แต่สามารถใช้
objcopy แปลง COFF object file เป็น ELF ได้
ปัญหาในการพอร์ต
System Calls
- ปัญหาแรกคือ Linux กับ UNIX ไม่มีอินเทอร์เฟซ system call แบบเดียวกัน
- UNIX ใช้อินเทอร์เฟซ
lcall7 จึงตัดสินใจหา open() แล้วให้เรียกผ่าน glibc แทน
→ ถ้าเปลี่ยนสัญลักษณ์นี้ให้เป็น undefined ตัวลิงเกอร์จะจัดการเองได้หรือไม่?
→ แต่ objcopy ไม่ได้ทำงานแบบนั้น สุดท้ายจึงเขียนเครื่องมือชื่อ coffsyrup ขึ้นมาเพื่อลบออกแบบบังคับ
- ฟังก์ชันที่เข้ากันไม่ได้หลายตัวถูกเปลี่ยนทั้งหมดด้วย
objcopy + coffsyrup
→ stat(), times(), uname(), fcntl(), ioctl()
Licensing
- แน่นอนว่าซอฟต์แวร์นี้ไม่สามารถทำงานได้หากไม่มีไลเซนส์
- ผู้เขียนเป็นเจ้าของชุดกล่อง Lotus 1-2-3 ของแท้อยู่แล้ว และมันก็เป็น abandonware ที่มีอายุ 32 ปี
จึงคิดว่าน่าจะไม่เป็นไรหาก Mitch Kapor ผู้พัฒนาจะปล่อยผ่านการข้ามการตรวจสอบไลเซนส์นี้
→ (Mitch Kapor เป็นที่รู้จักจากการพัฒนา Lotus และยังเป็นผู้ร่วมก่อตั้ง EFF ด้วย)
- ในฟังก์ชัน
lic_init() ถ้าไฟล์ LICENSE.000 มีวันที่และชื่อผู้ใช้/ระบบอยู่ก็จะทำงาน ดังนั้นจึงตั้งค่าให้ตรงและผ่านได้!
ผลลัพธ์
- สุดท้ายแล้ว Lotus 1-2-3 ก็ถูกพอร์ตมายัง OS ใหม่อย่าง Linux
- ยังมีบางส่วนที่ติดขัดอยู่ แต่ใช้งานได้ 100%
4 ความคิดเห็น
โอ้พระเจ้า...นี่มันอะไรกัน.. สุดจัดเลย
ในบรรดาคนเก่ง คนที่เก่งที่สุดก็คือพวกฝรั่งจริง ๆ... คำพูดนั้นถูกต้องจริง ๆ นะ..
ว้าว.. เป็นความหลงใหลที่น่าทึ่งจริง ๆ ส่วนตัวผมไม่ได้ใช้ Lotus มากนัก และส่วนใหญ่ใช้ Multiplan มากกว่าครับ
https://en.wikipedia.org/wiki/Multiplan
Multiplan ก็มีเวอร์ชันภาษาเกาหลีออกมาด้วย ดังนั้นในยุคนั้นผลิตภัณฑ์นี้จึงเป็นเพียงตัวเดียวที่รองรับภาษาเกาหลีได้อย่างเหมาะสม
แม้จะยุติการผลิตไปในปี 94 แต่ในเกาหลียังมีหลายบริษัทที่ใช้งานอยู่ เลยน่าจะถูกใช้ต่อมาจนราว ๆ ปี 97 ครับ
การยุติการผลิต Multiplan - จุดจบของยุค DOS
https://www.hellomarket.com/item/162929337
เจอโพสต์ขายแพ็กเกจ Multiplan ภาษาเกาหลีแบบยังไม่แกะแล้วครับ.. โอ้โห..