12 điểm bởi xguru 2022-05-25 | 4 bình luận | Chia sẻ qua WhatsApp
  • Tóm tắt quá trình port phiên bản Unix của Lotus đã 30 năm tuổi sang Linux

Bối cảnh

  • Là fan của Lotus nên tác giả đã reverse engineering phiên bản DOS cũ, tạo một trình điều khiển hiển thị cho DosEmu để chạy nó
  • Tuy nhiên, các add-in của Lotus đời cũ thì không dùng được
  • Chúng được phát triển bằng một ngôn ngữ đặc biệt gọi là LPL, nhưng không có compiler/SDK
    → Thời đó đây là một sản phẩm trả phí tới $395, nên không tìm được ai còn giữ
  • Sau đó, thông qua một SYSOP từng vận hành BBS trong thập niên 90, tác giả lấy được một bản Warez của SDK từ bản sao lưu trên băng
    → ADK(Add-in Development Kit) for Lotus 1-2-3
  • Trên BBS đó cũng có một bản Warez của Lotus 1-2-3 for Unix
    → Đây là sản phẩm đã bị lãng quên vì bán không được bao nhiêu do có đối thủ văn phòng Unix nổi tiếng là SCO Professional

Lotus 1-2-3 for Unix

  • Nó được đóng gói dưới định dạng ảnh đĩa nén TD0, một định dạng từng được dùng trong thập niên 80
  • Dùng samdisk để chuyển sang ảnh đĩa raw
  • Trong nội dung đĩa, tác giả phát hiện có các object file chứa symbol của 1-2-3
    → Vào đầu thập niên 90, dlopen() chưa được dùng phổ biến nên kiểu này là cần thiết

Hack

  • Nhờ các object file này, nhiều thắc mắc về cấu trúc nội bộ của Lotus 1-2-3 đã được giải đáp
  • Trình điều khiển đang làm cũng có thể đảm nhiệm được nhiều việc hơn

GNU objcopy

  • Khi các object file này được biên dịch thì phiên bản Linux đầu tiên còn chưa ra mắt
  • Nhưng có thể dùng objcopy để chuyển object file COFF sang ELF

Vấn đề khi port

System Calls

  • Vấn đề đầu tiên là Linux và UNIX không có cùng giao diện system call
  • UNIX dùng giao diện lcall7, nên tác giả quyết định tìm open() rồi gọi qua glibc
    → Nếu đổi symbol này thành undefined thì linker có tự xử lý không?
    → Nhưng objcopy không hoạt động theo cách đó, nên cuối cùng tác giả đã viết một công cụ tên là coffsyrup để ép xóa chúng
  • Một số hàm không tương thích khác cũng được thay đổi hết bằng objcopy + coffsyrup
    stat(), times(), uname(), fcntl(), ioctl()

Licensing

  • Tất nhiên, phần mềm này không chạy nếu không có license
  • Tác giả là chủ sở hữu hợp pháp của hộp Lotus 1-2-3, và đây cũng là abandonware đã 32 năm tuổi, nên anh cho rằng có lẽ ngay cả Mitch Kapor cũng sẽ không phản đối việc bỏ qua bước kiểm tra license này
    → (Mitch Kapor nổi tiếng là người tạo ra Lotus, đồng thời cũng là đồng sáng lập EFF.)
  • Trong hàm lic_init(), nếu file LICENSE.000 có ngày tháng cùng tên người dùng/tên hệ thống thì chương trình sẽ chạy, nên tác giả đã khớp các giá trị đó để vượt qua

Kết quả

  • Kết quả là Lotus 1-2-3 đã được port sang một OS mới là Linux
  • Vẫn còn vài chỗ hơi rối, nhưng đã dùng được 100%

4 bình luận

 
nuthatch 2022-05-25

Trời ơi... cái này là gì vậy.. hãi thật

 
jjpark78 2022-05-25

Đúng là trong những người giỏi còn có người giỏi hơn... câu đó quả thật không sai..

 
xguru 2022-05-25

Wow.. thật sự là một niềm đam mê đáng kinh ngạc. Tôi không dùng Lotus nhiều đến vậy, mà chủ yếu dùng Multiplan.
https://en.wikipedia.org/wiki/Multiplan

Multiplan cũng từng có bản tiếng Hàn, nên vào thời đó đây là sản phẩm duy nhất hỗ trợ tiếng Hàn một cách đàng hoàng.
Dù đã bị ngừng sản xuất vào năm 94, nhưng ở Hàn Quốc vẫn có nhiều công ty đang sử dụng, nên tôi nghĩ nó còn được dùng đến khoảng năm 97.
Multiplan bị ngừng sản xuất - hồi kết của thời đại DOS

 
xguru 2022-05-25

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

Tôi đã tìm thấy một bài đăng bán gói Multiplan tiếng Hàn còn nguyên niêm phong.. uầy..