12 คะแนน โดย xguru 2022-05-25 | 4 ความคิดเห็น | แชร์ทาง WhatsApp
  • สรุปกระบวนการพอร์ต 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 ความคิดเห็น

 
nuthatch 2022-05-25

โอ้พระเจ้า...นี่มันอะไรกัน.. สุดจัดเลย

 
jjpark78 2022-05-25

ในบรรดาคนเก่ง คนที่เก่งที่สุดก็คือพวกฝรั่งจริง ๆ... คำพูดนั้นถูกต้องจริง ๆ นะ..

 
xguru 2022-05-25

ว้าว.. เป็นความหลงใหลที่น่าทึ่งจริง ๆ ส่วนตัวผมไม่ได้ใช้ Lotus มากนัก และส่วนใหญ่ใช้ Multiplan มากกว่าครับ
https://en.wikipedia.org/wiki/Multiplan

Multiplan ก็มีเวอร์ชันภาษาเกาหลีออกมาด้วย ดังนั้นในยุคนั้นผลิตภัณฑ์นี้จึงเป็นเพียงตัวเดียวที่รองรับภาษาเกาหลีได้อย่างเหมาะสม
แม้จะยุติการผลิตไปในปี 94 แต่ในเกาหลียังมีหลายบริษัทที่ใช้งานอยู่ เลยน่าจะถูกใช้ต่อมาจนราว ๆ ปี 97 ครับ
การยุติการผลิต Multiplan - จุดจบของยุค DOS

 
xguru 2022-05-25

https://www.hellomarket.com/item/162929337

เจอโพสต์ขายแพ็กเกจ Multiplan ภาษาเกาหลีแบบยังไม่แกะแล้วครับ.. โอ้โห..